在下面的代码中,我们返回一个 const 对象并将其收集到一个非 const 对象中,但它仍然可以编译而没有错误或警告。
class foo
{
int i;
public:
const foo& call() const
{
return *this;
}
};
int main()
{
foo aa, bb;
bb = aa.call();
}
在下面的代码中,我们返回一个 const 对象并将其收集到一个非 const 对象中,但它仍然可以编译而没有错误或警告。
class foo
{
int i;
public:
const foo& call() const
{
return *this;
}
};
int main()
{
foo aa, bb;
bb = aa.call();
}
当你这样做时,你实际上是在获取一个 const 对象的副本,bb = aa.call( )
这将调用隐式复制构造函数 on 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 的 const 引用,因此可以直接绑定 foo::call 返回的引用。此代码中没有调用复制构造函数。