好奇心から、インタビューの質問からこのコードを試しました[*]
int main(int argc, char *argv[])
{
int a = 1234;
printf("Outer: %d\n", a);
{
int a(a);
printf("Inner: %d\n", a);
}
}
Linux(g++4.6.3とclang++3.0の両方)でコンパイルすると、次のように出力されます。
Outer: 1234
Inner: -1217375632
ただし、Windows(VS2010)では、次のように出力されます。
Outer: 1234
Inner: 1234
理論的根拠は、2番目の「a」変数のコピーコンストラクターが終了するまで、最初の「a」変数に引き続きアクセスできるということです。ただし、これが標準的な動作なのか、それとも(他の)Microsoftの癖なのかはわかりません。
何か案が?
[*]実際の質問は次のとおりです。
一時変数またはグローバル変数を使用せずに、スコープ内の変数を、包含スコープ内の同じ名前の変数の値で初期化するにはどうすればよいですか?
{
// Not at global scope here
int a = 1234;
{
int a;
// how do you set this a to the value of the containing scope a ?
}
}