为什么在Lambda移动时未调用移动构造函数
Why is the move constructor not called when moving in a lambda?
我正在尝试编译以下代码:
#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
分配的错误,即调用已删除的函数,即复制构造函数。请注意,转移到p2_1
是可以的。为什么这不使用移动构造函数?
catch在此处的 operator()
默认情况下是lambda代表的匿名类类型的CC_3。这意味着您无法从p2_1
移动,因为Lambda的this
是该功能中的const&
。您需要做的是使用mutable
关键字,例如
int main() {
C2 p2;
([p2_1{ std::move(p2) }]() mutable {
auto p2_2 = std::move(p2_1); // <---
})();
return 0;
}
使函数非const的
又意味着您可以突变其成员。这使您可以移动p2_1
而不是尝试复制它。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 为什么调用复制构造函数而不是移动构造函数?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 编译器调用复制运算符而不是移动运算符
- C++:为什么不调用移动构造函数?
- 移动构造函数永远不会被调用
- 在之后仍需要使用源对象时调用父移动分配运算符
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 为什么这里不调用移动构造函数?
- std::使用内部对象移动 - 与调用不匹配
- 为什么不调用移动构造函数
- 为什么调用移动分配?
- 方法冗余移动调用的移动语义
- 移动构造函数的意外调用
- 为什么在这种情况下调用非常量右值移动构造函数?
- C++ - 从移动分配运算符调用复制分配
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- 构造函数解释为函数调用,并显式跳过移动构造函数
- x64 函数调用参数推送/移动顺序 (MSVC)