是否允许编译器消除按值捕获所需的拷贝?
vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
- 有没有编译器不需要复制的情况
movie1
?- 如果编译器可以知道,也许
apply
实际上没有改变movie1
? - 或者默认情况下 Lambda 是否有帮助
const
仿函数在任何情况下?
- 如果编译器可以知道,也许
- 是否有帮助
vector
有 move 构造函数 和 move assign?- 如果是,是否需要将这些添加到
Image
还有,为了防止在这里复制昂贵的拷贝?
- 如果是,是否需要将这些添加到
- 与按值参数相比,按值捕获在何时以及如何需要拷贝的机制是否存在差异?例如。
void operate(vector<Image> movie)
?
最佳答案
我很确定它不能。
即使外部函数不再显式使用变量,移动变量也会改变销毁的语义。
拥有 Image
的移动构造函数没有帮助,vector
可以 move
或 swap
而不移动其元素。
如果从现在开始变量是只读的,为什么不通过引用捕获呢?您甚至可以创建一个 const 引用并捕获它。
如果变量不是只读的,则需要复制。无论是外部函数还是 lambda 执行修改,编译器都不能允许该修改对对方可见。
我在按值捕获和按值参数传递之间看到的唯一区别是捕获被命名,它不能是临时的。所以不能使用适用于临时对象的参数传递优化。
关于C++0x : Capture By Value for Lambda, 总是一个拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5283112/