さまざまな退屈な理由から、ほとんどが 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++ は錆びていて、この奇妙なコンパイラーの決定の真相を突き止めるのに苦労しています。何か案は?