gpt4 book ai didi

C++11:何时调用 move ctor/operator=?

转载 作者:太空狗 更新时间:2023-10-29 19:53:44 26 4
gpt4 key购买 nike

#include <iostream>

class Class
{
public:
Class() { std::cerr << "ctor" << std::endl; }
~Class() { std::cerr <<"dtor" << std::endl; }

Class(Class&) { std::cerr << "copy ctor" << std::endl; }
Class & operator=(const Class &)
{
std::cerr << "copy operator=" << std::endl;
return *this;
}

Class(Class&&) { std::cerr << "move ctor" << std::endl;}
Class & operator=(Class &&)
{
std::cerr << "move operator="<< std::endl;
return *this;
}
};

int main(int, char**)
{
Class object;
Class && rvr = Class();
object = rvr; // (*)
}

输出是

ctor
ctor
copy operator=
dtor
dtor

1) 为什么在第 (*) 行调用“copy ctor”?

2) 如果我每次都必须使用 std::move(),那么“移动语义”和任何将移动数据的方法(如 object.destructive_move();)有什么区别>?

3) 什么时候调用 move ctor/operator?

谢谢!

最佳答案

在第 (*) 行没有调用复制构造函数,调用了复制赋值运算符。我想这就是你的意思。

rvr 以来,调用的是复制赋值运算符而不是移动赋值运算符。是一个左值。请注意,表达式的类型与它是否为左值是正交的。

如果您将赋值语句修改为 object = Class();甚至 object = static_cast<Class&&>(rvr) ,您会发现调用了移动赋值运算符,因为在这两种情况下 RHS 是右值。

这种行为是明智的:例如,考虑移动赋值运算符的实现。它的参数具有右值引用类型,但它仍然是一个左值。如果它是一个右值,那么第一次使用该参数可能会将其状态修改为“空”对象(移动语义),然后第二次使用该参数可能不会按预期工作。

它实际工作的方式,你会明确地使用 std::move当您想以使其处于“空”状态的方式使用参数时。

关于C++11:何时调用 move ctor/operator=?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11283887/

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