为什么编译器在调用 move 后选择复制 ctor

Why does the compiler choose the copy ctor after calling move


对于下面的代码,我知道因为我实现了一个拷贝构造函数,默认的move被编译器阻止了,我不明白的是为什么编译器选择了拷贝构造函数,而不是报错?
如果不存在右值引用函数,右值引用可以作为引用函数的参数吗?
如果不是,这里会发生什么?

#include <iostream>

using namespace std;

class A{
    public:

        A(){printf("constructor\n");}
        A(const A& a){printf("copy constructor");}
};

int main()
{ 
    A a;
    A b = std::move(a);
    return 1; 
}

输出为:

constructor
copy constructor

谢谢

std::move 会将您的命名值转换为右值表达式,仅此而已。

而且,就像任何其他右值一样,如果它不能移动,它将被复制。

T 类型的右值可以绑定到 const T& 就好了。

原因是右值表达式可以绑定到const左值引用.[=13的函数参数=]


另请注意,const 右值表达式 不能绑定到右值引用:

class A{
    public:    
        A(){printf("constructor\n");}
        A(const A& a){printf("copy constructor");}
        A(A&&) = default; // <-- has move ctor
}; 

int main()
{ 
    const A a; // <-- const!
    A b = std::move(a); // <-- copy not move!!!
    return 1; 
}

上面的代码仍然调用复制构造函数,即使有一个移动构造函数。