我希望在使用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
1条答案
按热度按时间kqhtkvqz1#
为什么用户定义的移动构造函数在下面的例子中没有被调用?
因为你只是绑定一个 * 右值引用 * 到一个
xvalue
,而不是实际构造一个Demo
类型的示例,也就是说,当你使用右值构造一个Demo
类型的示例时,一个move构造函数将被调用,如下所示:另外,赋值运算符中缺少return语句。