gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:02:16 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com