gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:39:16 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com