在std::erase_if函数的包装器上出现“转换会丢失限定符”错误

编程语言 2026-07-09

我正在为 std::erase_if 函数编写一个便捷包装器,它接收一个向量引用 vec 和一个用于检查数值是否相等并随后删除的 const object。这必须作为函数签名。object 在删除操作中不应起作用,因此对lambda表达式而言,无论它是否是 const,都不应产生影响。

下面的实现

template <typename T>
inline void vector_removeIfEquals(const std::vector<T>& vec, const T& object) {
    std::erase_if(vec, [object](T t) { return t == object; });
}

在编译时会产生错误 Conversion loses qualifiers,并且还多出一行 See declaration of std::erase_if

这些版本也会出现同样的问题:

template <typename T>
void vector_removeIfEquals(const std::vector<T>& vec, const T& object) {
    std::erase_if(vec, [&](const T& t) { return t == object; });
}

template <typename T>
void vector_removeIfEquals(const std::vector<T>& vec, const T& object) {
    // Create a non-const copy?
    T objectToRemove(object);
    std::erase_if(vec, [objectToRemove](T t) { return t == objectToRemove; });
}

有任何建议吗?

解决方案

Your problem is that std::erase_if inherently modifies the container (std::vector in this case). It is kind of hard to erase without changing the container.

This means a const std::vector is not a valid target of std::erase_if.

Just remove the const, eg:

// Source - https://stackoverflow.com/q/79933835
// Posted by gene b.
// Retrieved 2026-04-29, License - CC BY-SA 4.0

template <typename T>
inline void vector_removeIfEquals( /*const*/ std::vector<T>& vec, const T& object) {
    std::erase_if(vec, [object](T t) { return t == object; });
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章