我有这样的代码(简化):为什么remove_if(...,lambda)表达式需要赋值运算符?
std::vector<Session> sessions;
// ...
std::remove_if(sessions.begin(), sessions.end(),
[] (const Session& s) {
return false;
}
);
当我编译它(在Visual Studio 2013更新1)我得到以下错误:
algorithm(1759): error C2280: 'Session &Session::operator =(const Session &)' : attempting to reference a deleted function
Session.h(78) : see declaration of 'Session::operator ='
事实上,我已经在删除operator=
Session
类是这样的:
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
也无法诉诸复制,因此编译器显示错误。我通过手动实现移动构造函数和移动赋值操作符来修复它。
这不是_lambda表达式,需要'operator ='。它是'std :: remove_if'算法,因为它移动了元素(而不是删除它们)。 – nosid
@nosid:听起来不错。你为什么不把它作为答案发布? –
重写了一个触摸问题:虽然它完全不符合您的原始问题(毕竟问题不是您认为的问题),但对于有相同问题的人来说搜索应该更容易。 – Yakk