为什么不调用移动构造函数?
Why isn't move constructor invoked?
代码如下:http://coliru.stacked-crooked.com/a/f7731b48747c61a9
#include <iostream>
struct A{
A(const A&){ std::cout << "A(const A&)" << std::endl;}
A(const A&&){ std::cout << "A(const A&&)" << std::endl;}
A(){ }
};
A foo(){
return *new A;
}
int main()
{
A a;
A c(foo());
}
因为我向 c
的构造函数参数传递了一个临时对象,所以我希望调用移动构造函数。但是复制构造函数是。为什么?
因为 foo
returns 一个 非常量 右值,它不能绑定到常量右值引用。复制构造函数是唯一剩下的可行重载。
一个比复制构造函数更好重载的构造函数是:
A(A&&);
此外,构造函数(复制或移动)可以根据复制省略规则省略(例如 see here or here。)
代码如下:http://coliru.stacked-crooked.com/a/f7731b48747c61a9
#include <iostream>
struct A{
A(const A&){ std::cout << "A(const A&)" << std::endl;}
A(const A&&){ std::cout << "A(const A&&)" << std::endl;}
A(){ }
};
A foo(){
return *new A;
}
int main()
{
A a;
A c(foo());
}
因为我向 c
的构造函数参数传递了一个临时对象,所以我希望调用移动构造函数。但是复制构造函数是。为什么?
因为 foo
returns 一个 非常量 右值,它不能绑定到常量右值引用。复制构造函数是唯一剩下的可行重载。
一个比复制构造函数更好重载的构造函数是:
A(A&&);
此外,构造函数(复制或移动)可以根据复制省略规则省略(例如 see here or here。)