c++ 为什么用户定义的移动构造函数在下面的例子中没有被调用?

new9mtju  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(132)

我希望在使用std::move(any_object)之后,我们在右值引用中转换该对象,因此它应该调用我的用户定义的移动构造函数。但它不是这样工作的。有人能告诉我们发生了什么吗?

#include <iostream>
#include <memory>

struct Demo {
    int Value;
    Demo():Value(10) { std::cout << "Demo's default constructor called\n";}
    Demo(Demo& tempObj) { std::cout << "Demo non-const copy constructor called\n";}
    Demo(const Demo& tempObj) { std::cout << "Demo const copy constructor called\n"; }
    Demo(Demo&& tempObj) { std::cout << "Demo move constructor called\n"; }
    Demo(const Demo&& tempObj) { std::cout << "Demo const move constructor called\n"; }
    Demo& operator= (const Demo& tempObj){ std::cout << "Demo copy assignment operator called ";}
    Demo& operator= (Demo&& tempObj){ std::cout << "Demo move assignment operator called";}
    ~Demo(){ std::cout << "Demo's destructor called\n";}
};

void fun(Demo&& tempObj)
{
    tempObj.Value = 20;
}

int main()
{
    Demo demo;
    fun(std::move(demo));
}

//输出:

Demo's default constructor called
Demo's destructor called
kqhtkvqz

kqhtkvqz1#

为什么用户定义的移动构造函数在下面的例子中没有被调用?
因为你只是绑定一个 * 右值引用 * 到一个xvalue,而不是实际构造一个Demo类型的示例,也就是说,当你使用右值构造一个Demo类型的示例时,一个move构造函数将被调用,如下所示:

//-----------v-------->removed && from here
void fun(Demo tempObj)
{
    tempObj.Value = 20;
}
fun(std::move(demo)); //now this uses move constructor

另外,赋值运算符中缺少return语句。

相关问题