私は FDIS の次の 2 つの段落を読んでいました (12.2p{4,5}):
完全式の終わりとは異なる時点で一時変数が破棄される状況が 2 つあります。最初のコンテキストは、配列の要素を初期化するために既定のコンストラクターが呼び出されるときです。コンストラクターに 1 つ以上の既定の引数がある場合、既定の引数で作成されたすべての一時的な要素の破棄は、次の配列要素 (存在する場合) の構築の前に順序付けられます。
と
2 番目のコンテキストは、参照がテンポラリにバインドされる場合です。参照がバインドされている一時、または参照がバインドされているサブオブジェクトの完全なオブジェクトである一時は、参照の存続期間中存続します。[...]
- 関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。
これら2つの2つは、次の場合に矛盾しているようです
struct A {
A() { std::cout << "C" << std::endl; }
~A() { std::cout << "D" << std::endl; }
};
struct B {
B(A const& a = A()) { }
};
typedef B array[2];
int main() {
array{};
}
この出力CDCD
は、最初のコンテキストで必要とされるか、またはCCDD
2 番目のコンテキストで必要とされるように出力されますか? GCC は、2 番目のコンテキスト記述と出力に従っているようCCDD
です。何か重要なことを見落としていませんか?
編集: C++0x は必要ないと思います。このnew
-expression も私の質問の影響を受けます:
new array(); /* CDCD or CCDD ?? */
ただし、この場合、GCC は最初のコンテキストに従い、 を出力しますCDCD
。