0

次のコードでは、constオブジェクトを返し、それを非constオブジェクトに収集していますが、それでもエラーや警告なしでコンパイルされます。

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

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

2 に答える 2

15

bb = aa.call( )で暗黙のコピーコンストラクターを呼び出すときに、実際にconstオブジェクトのコピーを取得していますfoo

コンパイルを中断したい場合は、次を試してください。

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

ノート:

暗黙的なコピーコンストラクタは、一般的に次のように定義されます。

foo( const foo& exist );

デフォルトの場合、メンバーごとのコピーを実行します。

于 2012-05-02T13:29:54.503 に答える
0

このコードは、暗黙的に定義されたコピー代入演算子を呼び出しますfoo& foo::operator=(const foo&)

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

その代入演算子の引数はfooへのconst参照であるため、foo::callによって返される参照を直接バインドできます。このコードのいずれにも、コピーコンストラクターはありません。

于 2012-05-02T16:33:37.990 に答える