c++ - 为什么在 lambda 中 move 时不调用 move 构造函数?

标签 c++ c++11 lambda move-semantics

我正在尝试编译以下代码:

#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/

相关文章:

c++ - 智能指针是否排除了两阶段 build 的需要?

C++11模板错误信息: "cannot call member function without object"

c# - @Html.EditorFor(m => m) MVC 中的 lambda 语法

c++ - C++中的 “inline”关键字

c++ - 比较两个 QColor 对象的颜色

c++ - 如何在 C++11 中创建正态整数分布?

c# - 创建具有多个 OR 和 AND 条件的 LINQ 表达式树

C++:可以优化未使用的 lambda 显式捕获吗?

c++ 20范围库,如何使条件运算符工作?

c++ - C++ 中的 TCHAR* 到 char* 转换