C++ C++;0x:Lambda的按值捕获,是否始终为副本?
是否允许编译器删除by值捕获所需的副本C++ C++;0x:Lambda的按值捕获,是否始终为副本?,c++,c++11,copy-constructor,lambda,C++,C++11,Copy Constructor,Lambda,是否允许编译器删除by值捕获所需的副本 矢量电影1; apply([=movie1](){return movie1.size();}); 是否存在编译器不需要复制movie1的情况? 如果编译器知道,apply实际上不会改变电影1 或者,在任何情况下,lambda在默认情况下都是const函子,这有帮助吗 vector有一个移动构造函数和移动赋值,这有帮助吗? 如果是,是否也需要将这些内容添加到图像中,以防止在此处进行昂贵的复制 与按值参数相比,按值捕获需要拷贝的时间和方式在机制上
矢量电影1;
apply([=movie1](){return movie1.size();});
- 是否存在编译器不需要复制
的情况?movie1
- 如果编译器知道,
实际上不会改变电影1apply
- 或者,在任何情况下,lambda在默认情况下都是
函子,这有帮助吗const
- 如果编译器知道,
有一个移动构造函数和移动赋值,这有帮助吗?vector
- 如果是,是否也需要将这些内容添加到
,以防止在此处进行昂贵的复制图像中
- 如果是,是否也需要将这些内容添加到
- 与按值参数相比,按值捕获需要拷贝的时间和方式在机制上是否存在差异?例如,
无效操作(矢量电影)
图像
使用移动构造函数没有帮助,向量
可以移动
或交换
,而不移动其元素
如果从现在开始变量是只读的,为什么不通过引用捕获呢?您甚至可以创建一个const引用并捕获它 如果变量不是只读的,则需要副本。不管是外部函数还是lambda执行修改,编译器都不能允许修改对另一个可见 我看到的按值捕获和按值参数传递之间的唯一区别是捕获是命名的,它不能是临时的。因此,不能使用适用于临时变量的参数传递优化。始终存在“仿佛”规则。只要看起来遵循了规则,编译器就可以随心所欲。因此,对于复制构造函数和析构函数没有副作用的对象,如果没有对副本进行任何更改,或者之后没有访问原始对象(因此,如果我们对对象进行了更改,没有人会注意到),编译器可以证明根据“好像”规则删除副本是合法的
但除此之外,不,它不能像@Ben所说的那样仅仅消除拷贝。“常规”复制省略规则不包括这种情况。“为什么不通过引用捕获”?我正在理解所有的含义。我同意。“唯一的区别……”是一个很好的答案。完美的这就是我想要的术语:复制省略。感谢您澄清这些不能在这里应用。复制省略在这里不适用,因为复制省略是在有效地“移动”值的情况下引入的(无法再访问原始值-复制初始化和返回值都是如此)。对于lambda,您可以在lambda和原始上下文中访问捕获的值,因此它是真正的副本。
vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );