C++0x : Capture By Value for Lambda, 总是一个拷贝?

标签 c++ c++11 copy-constructor lambda

是否允许编译器消除按值捕获所需的拷贝

vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
  • 有没有编译器不需要复制的情况movie1 ?
    • 如果编译器可以知道,也许 apply实际上没有改变 movie1 ?
    • 或者默认情况下 Lambda 是否有帮助 const仿函数在任何情况下?
  • 是否有帮助 vectormove 构造函数move assign
    • 如果是,是否需要将这些添加到 Image还有,为了防止在这里复制昂贵的拷贝?
  • 按值参数相比,按值捕获在何时以及如何需要拷贝的机制是否存在差异?例如。 void operate(vector<Image> movie) ?

最佳答案

我很确定它不能。

即使外部函数不再显式使用变量,移动变量也会改变销毁的语义。

拥有 Image 的移动构造函数没有帮助,vector 可以 moveswap 而不移动其元素。

如果从现在开始变量是只读的,为什么不通过引用捕获呢?您甚至可以创建一个 const 引用并捕获它。

如果变量不是只读的,则需要复制。无论是外部函数还是 lambda 执行修改,编译器都不能允许该修改对对方可见。

我在按值捕获按值参数传递之间看到的唯一区别是捕获被命名,它不能是临时的。所以不能使用适用于临时对象的参数传递优化。

关于C++0x : Capture By Value for Lambda, 总是一个拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5283112/

相关文章:

c++ - 使用专门的模板并命名枚举选项

c++ - 将单个对象视为具有一个元素的数组,采用尾数指针

c++ - 为什么调用复制构造函数而不是 move 构造函数?

c++ - 在 C++03 中模拟 =delete 以限制复制/赋值操作的最简单方法是什么?

c++ - 运算符 '==' 没有左操作数

c++ - 终止调用引发异常中止陷阱 : 6

c++ - C++11 的用户自定义字面量(扩展字面量)……哪些编译器支持?

c++ - 将对象指针作为成员函数 : is it standard? 的第一个参数传递

c++ - C++中的内存扫描

c++ - 如何为模板类编写复制构造函数 - C++