私は最近、C++ の一時変数が完全なレキシカル スコープを持つように昇格されているのを見つけて驚きました。
class Foo {
public:
Foo() {
std::cout << "A";
}
~Foo() {
std::cout << "B";
}
};
int main(void)
{
// Prints "ACB", showing the temporary being promoted to having lexical scope.
const Foo& f = Foo();
std::cout << "C";
return 0;
}
参照に一時変数を代入するという疑わしい動作は別として、これは実際には問題なく機能します (VS2010 および G++ v4.1 でテスト済み)。出力はACB
であり、一時オブジェクトが字句スコープを持つように昇格され、関数の最後でのみ破棄されることを明確に示しています ( のB
後に出力されC
ます)。
他の一時変数はこのようには動作しません:
int main(void)
{
// Prints "ACBD", showing that the temporary is destroyed before the next sequence point.
const int f = ((Foo(), std::cout << "C"), 5);
std::cout << "D";
return 0;
}
私のコードコメントによると、これは を出力ACBD
し、式全体の評価が終了するまで一時変数が保持されることを示します (なぜC
が前に出力されるのかB
) が、次のシーケンスポイントの前にまだ破棄されます (なぜB
が前に出力されるのかD
)。(この動作は、C++ のすべての一時変数が機能すると私が考えていた方法でした。以前の動作には非常に驚きました。)
このようなレキシカルスコープを持つために一時的に昇格することが合法である場合、誰かが説明できますか?