无法理解编译器的行为(创建对象)

时间:2011-10-22 15:01:36

标签: 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; return *this; }
    ~A(){ std::cout << "destroyed" << std::endl; }
};

现在,行

A a = A().get();

A a;    
a = A();

编译并正常工作,但

A a = A();

的权利要求:

no matching function for call to ‘A::A(A)’
note: candidates are: A::A(A&)
note:                 A::A()

为了使事情明确,

A a = (A&)A();

的权利要求:

error: invalid cast of an rvalue expression of type ‘A’ to type ‘A&’

我完全不明白这种行为。

P.S。我知道,如果我在copy c_tor中进行const引用,一切都会好的。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

这很简单:rvalue(即必须在等号的右侧),可以转换为常量引用或被复制。只有左值(即可以放在等号左边的东西)可以转换成非常量参考。原因是您可能想要修改非常量引用的内容,这将是无效的。

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

答案 2 :(得分:2)

A a = A();

此行尝试调用复制构造函数传递临时对象,复制构造函数通过非const引用获取参数。但是临时对象不能绑定到非const引用。这就是你得到编译错误的原因。

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

A(const A& other) { std::cout << "copied" << std::endl; }