允许编译器消除按值捕获所需的副本吗?
vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
movie1
的情况?apply
实际上并没有改变movie1
? const
仿函数都有助于? vector
具有移动构造函数和移动分配功能是否完全有帮助?Image
中,以防止在此处复制昂贵的内容? void operate(vector<Image> movie)
? 最佳答案
我敢肯定它不会。
即使外部函数不再显式使用变量,移动变量也会改变销毁的语义。
具有Image
的移动构造函数无济于事,vector
可以在不移动其元素的情况下move
或swap
。
如果从现在开始该变量是只读的,为什么不通过引用捕获呢?您甚至可以创建一个const引用并捕获它。
如果变量不是只读的,则需要副本。外部函数或lambda是否执行修改都无关紧要,编译器无法允许其他人看到该修改。
我看到按值捕获和按值参数传递之间的唯一区别是捕获是命名的,它不能是临时的。因此,无法使用适用于临时人员的参数传递优化。