将常量引用分配给非常量对象

Assign const ref to non-const object

本文关键字:常量 非常 对象 分配 引用      更新时间:2023-10-16

在下面的代码中,我们返回一个 const 对象并将其收集在一个非 const 对象中,但它仍然编译而没有错误或警告。

class foo
{
    int i;
public:
    const foo& call() const
    {
        return *this;
    }
};
int main()
{
    foo aa, bb;
    bb = aa.call();
}

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

如果您想破坏编译,请尝试:

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

注意:

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

foo( const foo& exist );

默认情况下,只执行成员复制

此代码调用隐式定义的副本分配运算符foo& foo::operator=(const foo&)

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

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