在下面的代码中,我们返回一个const对象并将其收集在非const对象中,并且它仍然可以编译而不会出现错误或警告。
class foo
{
int i;
public:
const foo& call() const
{
return *this;
}
};
int main()
{
foo aa, bb;
bb = aa.call();
}
答案 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返回的引用。在任何此代码中都没有调用复制构造函数。