我正在尝试编译以下代码:
#include <utility>
struct C2 {
C2() = default;
C2(C2 const&) = delete;
C2(C2&&) = default;
};
int main() {
C2 p2;
([p2_1{ std::move(p2) }]() {
auto p2_2 = std::move(p2_1); // <---
})();
return 0;
}
但是,这不会编译并给出一个错误,即对 p2_2
的赋值正在调用已删除的函数,即复制构造函数。请注意, move 到 p2_1
很好。为什么不使用 move 构造函数?
最佳答案
这里要注意的是,lambda 表示的匿名类类型的 operator()
默认为 const
。这意味着您不能从 p2_1
move ,因为 lambda 的 this
在函数中是 const&
。您需要做的是使用 mutable
关键字,例如
int main() {
C2 p2;
([p2_1{ std::move(p2) }]() mutable {
auto p2_2 = std::move(p2_1); // <---
})();
return 0;
}
这使得函数非 const 反过来意味着你可以改变它的成员。这允许您 move p2_1
而不是试图复制它。
关于c++ - 为什么在 lambda 中 move 时不调用 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236014/