Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;0x:Lambda的按值捕获,是否始终为副本?_C++_C++11_Copy Constructor_Lambda - Fatal编程技术网

C++ C++;0x:Lambda的按值捕获,是否始终为副本?

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有一个移动构造函数和移动赋值,这有帮助吗? 如果是,是否也需要将这些内容添加到图像中,以防止在此处进行昂贵的复制 与按值参数相比,按值捕获需要拷贝的时间和方式在机制上

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

矢量电影1;
apply([=movie1](){return movie1.size();});
  • 是否存在编译器不需要复制
    movie1
    的情况?
    • 如果编译器知道,
      apply
      实际上不会改变电影1
    • 或者,在任何情况下,lambda在默认情况下都是
      const
      函子,这有帮助吗
  • vector
    有一个移动构造函数和移动赋值,这有帮助吗?
    • 如果是,是否也需要将这些内容添加到
      图像中
      ,以防止在此处进行昂贵的复制
  • 与按值参数相比,按值捕获需要拷贝的时间和方式在机制上是否存在差异?例如,
    无效操作(矢量电影)

我相当肯定它不能

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

图像
使用移动构造函数没有帮助,
向量
可以
移动
交换
,而不移动其元素


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

如果变量不是只读的,则需要副本。不管是外部函数还是lambda执行修改,编译器都不能允许修改对另一个可见

我看到的按值捕获和按值参数传递之间的唯一区别是捕获是命名的,它不能是临时的。因此,不能使用适用于临时变量的参数传递优化。

始终存在“仿佛”规则。只要看起来遵循了规则,编译器就可以随心所欲。因此,对于复制构造函数和析构函数没有副作用的对象,如果没有对副本进行任何更改,或者之后没有访问原始对象(因此,如果我们对对象进行了更改,没有人会注意到),编译器可以证明根据“好像”规则删除副本是合法的


但除此之外,不,它不能像@Ben所说的那样仅仅消除拷贝。“常规”复制省略规则不包括这种情况。

“为什么不通过引用捕获”?我正在理解所有的含义。我同意。“唯一的区别……”是一个很好的答案。完美的这就是我想要的术语:复制省略。感谢您澄清这些不能在这里应用。复制省略在这里不适用,因为复制省略是在有效地“移动”值的情况下引入的(无法再访问原始值-复制初始化和返回值都是如此)。对于lambda,您可以在lambda和原始上下文中访问捕获的值,因此它是真正的副本。
vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );