在std::erase_if函数的包装器上出现“转换会丢失限定符”错误
我正在为 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。