C++/CLI で、明示的な初期値なしでローカル参照変数を宣言すると、常に nullptr に初期化されると考えました。これは、ローカル ブロックへの 2 回目以降のエントリでは発生しないことがわかっています。これがサンプルコードです。
void main()
{
for (int i=0; i<6; i++)
{
switch (i)
{
case 2:
Console::WriteLine("i={0} localI and hashTable no longer in scope", i);
break;
default:
{
// Declare local reference variable
Hashtable^ hashTable;
Int32 localI;
Console::WriteLine("i={0} localI={1} {2}",
i, localI,
hashTable == nullptr ? "hashTable=nullptr" : "hashTable NOT SET to nullptr"
);
hashTable = gcnew Hashtable();
localI = i+1;
}
break;
}
}
}
これからの出力は次のとおりです。
i=0 localI=0 hashTable=nullptr
i=1 localI=1 hashTable NOT SET to nullptr
i=2 localI and hashTable no longer in scope
i=3 localI=2 hashTable NOT SET to nullptr
i=4 localI=4 hashTable NOT SET to nullptr
i=5 localI=5 hashTable NOT SET to nullptr
明示的な初期化を追加すると
Hashtable^ hashTable = nullptr;
Int32 localI = 99;
次に、各ループが参照と localI を再初期化します
i=0 localI=99 hashTable=nullptr
i=1 localI=99 hashTable=nullptr
i=2 localI and hashTable no longer in scope
i=3 localI=99 hashTable=nullptr
i=4 localI=99 hashTable=nullptr
i=5 localI=99 hashTable=nullptr
これは、私がMSDN で見つけた次の内容と矛盾しているようです。
「次のコード例は、ハンドルが宣言され、明示的に初期化されていない場合、デフォルトで nullptr に初期化されることを示しています。」