次のコードでは、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();
}
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へのconst参照であるため、foo::callによって返される参照を直接バインドできます。このコードのいずれにも、コピーコンストラクターはありません。