- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这段代码(简化):
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)。但是因为您已经显式delete
d 复制赋值运算符,所以移动赋值运算符也隐式delete
d。
假设 Session
可以支持移动语义,您可以通过定义移动赋值运算符让 remove_if
工作。例如,只需添加一个 default
ed 移动赋值运算符就足以解决眼前的问题(请注意,您可能无法依赖编译器生成的版本,可能必须自己定义一个)。
Session& operator=(Session&&) = default;
VS2013 不支持默认的移动构造函数/赋值运算符,因此在您的情况下您将被迫实现一个。
关于c++ - 为什么 remove_if( ..., lambda ) 表达式需要赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086717/
我有一个弱指针 vector ,如果指针仍然存在,我想遍历该列表并执行一个函数。如果指针不见了,我想将其移除。 class my_class { public: std::shared_ptr
我一直在阅读最新的 C++ 规范,但我无法弄清楚是否可以为同一元素多次调用 remove_if。特别是,我正在查看在 deque 迭代器上调用的 std::remove_if。据我所知,如果它所做的只
我正在尝试从字符串中删除空格。但抛出错误。 我的代码哪个参数做错了..感谢您的查看 我的主要功能 #include #include #include #include #include #
在下面的示例中,我从列表中删除了 pr2 对其应用返回 true 的范围内的一些元素。 m_list.remove_if(pr2(*tmp_list)); 在我看来有必要删除上面删除的这个对象,因为当
如果那些没有修改容器?例如,我想输出我从 vector 中删除的所有整数(我不想使用多次传递:例如:partition + output + erase)。撇开设计恐怖不谈,这是合法的: v.eras
我想删除按引用传递的字符串中的第一个和最后一个括号。不幸的是,我很难有条件地删除第一个和最后一个元素。我不明白为什么 remove_if 不能像我期望的那样使用迭代器。 Demo #include
我想使用 remove_if 函数从 vector 中删除元素,但将删除限制为 N 个元素。 例子: // predicate function that determines if a value
VS2010编译错误: c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(1840): error C2
有人可以告诉我如何使用 Remove_If 进行一些不区分大小写的比较吗? 目前我是这样做的: template struct is_literal { enum{value = false};
我正在考虑在下面的伪代码中对字符串 vector 使用 remove_if: for(some strings in a given set) { remove_if(myvec.begin(),
我正在尝试使用 std::remove_if从一个简单的字符串中删除空格,但我得到了奇怪的结果。有人可以帮我弄清楚发生了什么吗? 该代码是: #include #include #include
我的 remove_if 似乎正在用过滤掉的元素的值覆盖未过滤掉的元素。这些代码的目的是允许用户过滤和仅显示某个类别的教师。 (不删除任何元素)下面是部分代码 static string compar
我想知道是否可以使用 remove_if 和 lambda 表达式来表示此表达式。 std::list::iterator astit = actors.begin();
我收到的以下代码的错误消息是: error C2662: 'DamageNumbers::IsAlive' : cannot convert 'this' pointer from 'cons
我正在为具有硬编码最大元素数 N 的数据结构开发一种删除方法,它依赖于 std::array 来避免堆内存。虽然 std::array 只包含 N 个元素,但只有 M 个元素,其中 M 是“相关”元素
我正在尝试从字符串中删除空格 line.erase(remove_if(line.begin(), line.end(), isspace), line.end()); 但是 Visual Studi
我正在尝试使用 remove_if 从 vector 中删除对,但出现错误 bool MyClass::isSingleTag(const pair & val) { string tag =
这里的str是一个string: str.erase(std::remove_if(str.begin(), str.end(), &islower)); 似乎只删除字符串前面的小写字符。为什么会这样
我想知道如何根据条件从列表中删除对象。 经过研究,我得到了这个,但是还是不行! 所以我想知道如何使用带删除的remove_if。 Class A { public: A(int x,int y
我有密码 vector v; v.erase(remove_if(v.begin(),v.end(),bool_checker),v.end()); 其中 v 是一个包含随机数 {2, 4 ,5,
我是一名优秀的程序员,十分优秀!