gpt4 book ai didi

c++ - 为什么 remove_if( ..., lambda ) 表达式需要赋值运算符?

转载 作者:太空狗 更新时间:2023-10-29 23:30:21 25 4
gpt4 key购买 nike

我有这段代码(简化):

std::vector<Session> sessions;
// ...
std::remove_if( sessions.begin(), sessions.end(),
[] (const Session& s) {
return false;
}
);

当我编译它时(在 Visual Studio 2013 Update 1 中)我收到以下错误:

algorithm(1759): error C2280: 'Session &Session::operator =(const Session &)' : attempting to reference a deleted function
Session.h(78) : see declaration of 'Session::operator ='

确实,我已经删除了 Session 类中的 operator=,如下所示:

Session& operator= (const Session& that) = delete;

我的问题是:为什么使用 lambda 表达式的 remove_if 需要赋值运算符?一个 Session 对象在哪里分配给另一个对象?

更新:如@nosid 和@Praetorian 所述,remove_if 需要移动或复制构造函数和赋值运算符。根据 C++11 标准,移动构造函数/赋值运算符应该由编译器自动生成。遗憾Visual Studio 2013 does not do that .由于该类不可复制 remove_if 也不能求助于复制,因此编译器会显示错误。我通过手动实现一个移动构造函数和一个移动赋值运算符来修复它。

最佳答案

std::remove_if 要求通过取消引用迭代器获得的对象是 MoveAssignable (§25.3.8/1)。但是因为您已经显式deleted 复制赋值运算符,所以移动赋值运算符也隐式deleted。

假设 Session 可以支持移动语义,您可以通过定义移动赋值运算符让 remove_if 工作。例如,只需添加一个 defaulted 移动赋值运算符就足以解决眼前的问题(请注意,您可能无法依赖编译器生成的版本,可能必须自己定义一个)。

Session& operator=(Session&&) = default;

Live demo


VS2013 不支持默认的移动构造函数/赋值运算符,因此在您的情况下您将被迫实现一个。

关于c++ - 为什么 remove_if( ..., lambda ) 表达式需要赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com