我一直在努力解决这个问题,但我无法找到解释。 假设我有以下代码
class foo
{
public:
foo()
{std::cout << "Regular constructor \n";}
foo( const foo& a) //In abscence of const keyword the copy constructor is called
{std::cout << "Copy constructor \n";}
foo& operator=(const foo& a)
{std::cout << "Copy Assignment operator \n";}
foo(foo&& a)
{
std::cout << "Move constructor \n";
}
foo& operator=(foo&& a)
{std::cout << "Move Assignment operator \n";}
int a;
};
foo myfunction()
{
foo d;
d.a =120;
return d;
}
现在,如果我做这样的事情
foo a = myfunction();
这是我所期待的。 myfunction()返回一个对象左值,但是因为myfunction()是临时的,它会返回一个右值。我对么 ?现在在这种情况下,将调用移动构造函数,这是有道理的。但是,如果我从复制构造函数中删除const
关键字,则调用复制构造函数而不是移动构造函数。有人可以向我解释为什么会这样吗?提前谢谢。
答案 0 :(得分:4)
VS2012有一个讨厌的扩展,允许临时绑定到左值引用。我们无法使用现代的,符合标准的编译器来重现,实际上 elide 调用copy / move-constructor(因为RVO)。应用选项fno-elide-constructors
表明,即使缺少const
,它们确实也会调用move-constructor。
答案 1 :(得分:1)
只要从相同类型的xvalue初始化对象,就会调用移动构造函数,其中包括:
初始化,T a = std :: move(b);或T a(std :: move(b));,其中b的类型为T
函数参数传递:f(std :: move(a));,其中a是T类型,f是void f(T t)
函数返回:返回a;在诸如T f()之类的函数中,其中a是T类型,它具有移动构造函数。