将const ref分配给非const对象

时间:2012-05-02 13:28:58

标签: c++

在下面的代码中,我们返回一个const对象并将其收集在非const对象中,并且它仍然可以编译而不会出现错误或警告。

class foo
{
    int i;
public:
    const foo& call() const
    {
        return *this;
    }
};

int main()
{
    foo aa, bb;
    bb = aa.call();
}

2 个答案:

答案 0 :(得分:15)

当你执行bb = aa.call( )时,你实际上正在获取一个const对象的副本,这将调用foo上的隐式复制构造函数。

如果你想打破编译,请尝试:

foo aa;
foo& bb = aa.call( );

注意:

隐式复制构造函数通常定义为:

foo( const foo& exist );

并且在默认情况下只执行成员副本。

答案 1 :(得分:0)

此代码调用隐式定义的复制赋值运算符foo& foo::operator=(const foo&)

    int main()
    {
        foo aa, bb;
        bb = aa.call();//  equivalent to bb.operator=(aa.call());
    }

该assign运算符的参数是对foo的const引用,因此可以直接绑定foo :: call返回的引用。在任何此代码中都没有调用复制构造函数。