为什么不调用移动构造函数?

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。)