【发布时间】:2020-03-25 14:59:12
【问题描述】:
在 lambda 表达式(作为返回值)中的按值捕获 ([x])(或 C++14 移动捕获 [x = std::move(x)])中的复制(移动)构造是否可能(或保证)是省略了吗?
auto param_by_value(Widget w) {
// manipulating w ...
return [w] { w.doSomeThing(); };
}
auto param_by_move(Widget w) {
// manipulating w ...
return [w = std::move(w)] { w.doSomeThing() };
}
auto local_by_value() {
Widget w;
// manipulating w ...
return [w] { w.doSomeThing(); };
}
auto local_by_move() {
Widget w;
// manipulating w ...
return [w = std::move(w)] { w.doSomeThing() };
}
我的问题是:
- 上述函数中
w的复制(移动)是否可能(甚至保证)被忽略? (我记得显式的std::move有时会阻止复制省略,并且参数的复制/移动不可能被省略。) - 如果在情况 1 和 3 中不会发生复制省略,
w的按值捕获是否会调用Widget的移动构造函数? - 按价值或使用
std::move应该首选哪个作为最佳做法?
【问题讨论】:
-
但是返回的 lambda 不会像保证的那样进行复制/移动。 :)
标签: c++ c++17 copy-elision