18

私は 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は、最初のコンテキストで必要とされるか、またはCCDD2 番目のコンテキストで必要とされるように出力されますか? GCC は、2 番目のコンテキスト記述と出力に従っているようCCDDです。何か重要なことを見落としていませんか?


編集: C++0x は必要ないと思います。このnew-expression も私の質問の影響を受けます:

new array(); /* CDCD or CCDD ?? */

ただし、この場合、GCC は最初のコンテキストに従い、 を出力しますCDCD

4

1 に答える 1

2

矛盾はないと思います。

5.2.2 は、関数呼び出しとは何かを明確に示しています。関数呼び出しは、関数への引数を構成する式のコンマ区切りの空のリストを含む括弧が後に続く後置式です。

プログラムのどこにも関数呼び出しがないように見えるB::B(A const&)ので、2 番目の節がどのように適用されるかわかりません。

1.9p10などを考えると、上記の編集はおそらく正しくありません。

于 2011-06-11T18:56:54.240 に答える