2

さまざまな退屈な理由から、ほとんどが int として機能するが、オブジェクト階層の他の部分と連携できるようにベースから継承するクラスであるボックス化された int クラスが必要です。コード内でボックス化された int と通常の int を簡単に混在させることができるように、int を受け取るコンストラクターと int キャストを含めました。ただし、理解できない非常に奇妙な動作が見られます。関数からボックス化された int を返すときに、別の BoxedInt への参照を取得するコピー コンストラクターを使用したいと考えています。ただし、代わりに、ボックス化された int を int にキャストしてから、int コンストラクターを使用します。私の実際のコードベースには、この場合にコピーしたい他の基本クラス プロパティがあり、このキャスト/コンストラクタ パスを使用することでそれらが失われるため、これは問題を引き起こします。問題のコードは次のとおりです。

class BoxedInt
{
private:
    int m_int;
public:
    BoxedInt():m_int(0)
    {
        trace(L"Constructed with nothing");
    }

    BoxedInt(int val):m_int(val)
    {
        trace(L"Constructed with int");
    }

    BoxedInt(BoxedInt& val)
    {
        trace(L"Constructed with reference");
        m_int = val.m_int;
    }

    operator int()
    {
        trace(L"Cast to int");
        return m_int;
    }
};

BoxedInt funky()
{
    BoxedInt TempInt = 1;
    return TempInt;
}

int main(int argc, char* argv[])
{
    trace(L"Start");
    BoxedInt test1 = 1;
    trace(L"Copying");
    BoxedInt test2 = test1;
    trace(L"Assigning from return value");
    BoxedInt test3 = funky();
    trace(L"Done");
    return 0;
}

これを実行すると、出力は次のようになります。

Start
Constructed with int
Copying
Constructed with reference
Assigning from return value
Constructed with int
Constructed with reference
Cast to int
Constructed with int
Done

したがって、ある値を別の値に割り当てると、予想どおり、参照ベースのコンストラクターが使用されます。ただし、関数の戻り値を BoxedInt に割り当てると、何らかの理由でコンパイラが int にキャストし、int コンストラクターを使用することを決定します。私の C++ は錆びていて、この奇妙なコンパイラーの決定の真相を突き止めるのに苦労しています。何か案は?

4

3 に答える 3

9

コピー コンストラクターは非 const への参照を取るため、一時的に呼び出すことはできません。の戻り値 funky()は一時的なものであるため、コピー コンストラクターを使用して を構築することはできませんtest3

コピー コンストラクターが const 参照を取るようにします。これで問題ありません。

于 2013-10-15T16:53:31.283 に答える
5

コピー コンストラクターは非 const 参照を受け取ります。つまり、パラメーターに一時的なものをバインドできません。これは、目的の戻り方法とまったく同じです。したがって、コンパイラは他のルートを選択します。

コピー コンストラクターを変更します。

BoxedInt(const BoxedInt &val) {

実際、Clang 3.4BoxedInt test1 = 1;.

于 2013-10-15T16:53:02.927 に答える
1

問題 (またはその 1 つ) は、コピー コンストラクターの署名にあると思います。

BoxedInt(BoxedInt& val)

そのはず

BoxedInt(const BoxedInt& val)
于 2013-10-15T16:53:23.963 に答える