移动lambda时为什么不调用移动构造函数?

Bar*_*uch 18 c++ lambda move-semantics c++11

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译并给出一个错误,即赋值p2_2为调用已删除的函数,即复制构造函数.请注意,搬迁p2_1很好.为什么这不使用移动构造函数?

Nat*_*ica 27

这里的问题是operator()lambda表示的匿名类类型是const默认的.这意味着你不能移动,p2_1因为thislambda const&在函数中.你需要做的是使用mutable关键字like

int main() {
        C2 p2;
        ([p2_1{ std::move(p2) }]() mutable {
                auto p2_2 = std::move(p2_1); // <---
        })();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这使得函数non const反过来意味着你可以改变它的成员.这允许您移动p2_1而不是尝试复制它.

  • @ baruch`his`是const但是`*this`不是.它是一个const指针,但不是指向const的指针. (3认同)