C++ 0x:为Lambda捕获值,总是一个副本?

tow*_*owi 14 c++ lambda copy-constructor c++11

是否允许编译器删除按值捕获所需的副本

vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
Run Code Online (Sandbox Code Playgroud)
  • 有没有编译器不需要复制的情况movie1
    • 也许如果编译器可以知道,那apply实际上并没有改变 movie1
    • 或者,在任何情况下,Lambdas都是默认的const仿函数吗?
  • 它是否有助于在所有vector有一个移动构造函数移动分配
    • 如果是,是否还需要添加这些Image,以防止昂贵的副本?
  • 按值参数相比,值捕获需要副本的时间和方式是否存在差异?例如.?void operate(vector<Image> movie)

Ben*_*igt 9

我很相信它不能.

即使外部函数不再显式使用变量,移动变量也会改变破坏的语义.

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

如果变量从这一点开始是只读的,为什么不通过引用捕获?你甚至可以创建一个const引用并捕获它.

如果变量不是只读的,则需要复制.无论外部函数还是lambda执行修改都无关紧要,编译器不能允许该修改对另一个进行修改.

我在by-value captureby-value参数传递之间看到的唯一区别是捕获被命名,它不能是临时的.因此,不能使用适用于临时值的参数传递优化.