C++ Can';我不懂编译器&x27;用户行为(创建对象)

C++ Can';我不懂编译器&x27;用户行为(创建对象),c++,C++,我编写了以下代码: #include <iostream> class A { public: A(){ std::cout << "created" << std::endl; } A(A& other) { std::cout << "copied" << std::endl; } A& get(){ std::cout <<"got" << std::endl; r

我编写了以下代码:

#include <iostream>

class A
{
public:
    A(){ std::cout << "created" << std::endl; }
    A(A& other) { std::cout << "copied" << std::endl; }
    A& get(){ std::cout <<"got" << std::endl; return *this; }
    ~A(){ std::cout << "destroyed" << std::endl; }
};

正确编译和工作,但是

A a = A();
索赔:

no matching function for call to ‘A::A(A)’
note: candidates are: A::A(A&)
note:                 A::A()
error: invalid cast of an rvalue expression of type ‘A’ to type ‘A&’
把事情说清楚,

A a = (A&)A();
索赔:

no matching function for call to ‘A::A(A)’
note: candidates are: A::A(A&)
note:                 A::A()
error: invalid cast of an rvalue expression of type ‘A’ to type ‘A&’
我完全不理解这种行为


另外,我知道,如果我在复制构造函数中引用
const
,一切都会好起来。

复制构造函数应该将其参数作为
const
引用(或简单的
a
值)。在当前设置中,程序必须对临时文件进行可变引用,这是无效的

A a = A();
此行尝试调用传递临时对象的复制构造函数,复制构造函数通过非常量引用获取参数。但是临时对象不能绑定到非常量引用。这就是为什么会出现编译错误

但是,临时对象可以绑定到
const
引用。因此,解决方案是将参数
const
引用为:

A(const A& other) { std::cout << "copied" << std::endl; }
A(const A&other){std::cout这很简单:右值(即必须位于等号右侧的东西)可以转换为常量引用或被复制。只有左值(即可以放置在等号左侧的东西)可以转换为非常量引用。原因是您可能会试图修改非常量引用的内容,这将是无效的


A()
是一个右值,因此无法转换为非常量引用。这是您的错误。

您知道,g++有时不这么认为。例如,类型为
std::auto_ptr
的私有成员将使g++使用非常量创建默认副本reference@Lol4t0:可以让一个副本接受一个非常量引用;当您尝试将其用于无法转换为非常量ref的对象时,问题就出现了,如本例中所示。好吧,但为什么c_tor返回r-value?我可以调用该r-value的成员,甚至可以编写a()=a();:)此外,为什么我的get()函数工作?如果你看一下输出,你会发现,没有对象被删除两次,而且看起来,r值可以是l值。这个解释对我来说听起来最符合逻辑