5

以下の return ステートメントのように、コンストラクター パラメーターを介して初期化される匿名オブジェクトを作成できます。

struct S {
  S(int i_, int j_) : i(i_), j(j_) { }
  int i, j;
};

S f()
{
  return S(52, 100);
}

int main()
{
  cout << f().i << endl;
  return 0;
}

しかし、ブレース初期化子で初期化された匿名集約を同様に作成できますか? たとえば、以下の f() の本体を、「s?」なしで単一の return ステートメントに折りたたむことができますか?

struct S {
  int i, j;
};

S f()
{
  S s = { 52, 100 };
  return s;
}

int main()
{
  cout << f().i << endl;
  return 0;
}
4

3 に答える 3

8

現在のバージョンの C++ ではできません。あなたはC++ 0xでできるでしょう - とにかく信じています。もちろん、それはまだ修正の余地があります.C++ 0xで概念を指定できると信じていましたが、それはなくなりました...

編集:参照は [dcl.init] (§8.5/1) in N2960になります。最も関連性の高いビットは、BNF の「braced-init-list」の定義です (および、そのセクションで説明されている初期化が戻り値に適用できる/適用されることを示すテキストの最後のビット)。

于 2009-10-20T19:45:44.277 に答える
5

C++ にはありません。しかし、C99 では、いわゆる複合リテラルを使用して、次のことができます。

struct S {
  int i, j;
};

struct S F()
{
  // Valid C99, invalid C++:
  return (struct S){ 52, 100 };
}

[C99: §6.5.2、6.5.2.5]
[C++98: §5.2.3、8.5、12.1、12.2]

一部の C++ コンパイラはこれを拡張機能として提供していますが、これは合法的な ISO C++98 ではありません。たとえば、g++ はデフォルトでこのコードを受け入れますが、-pedanticオプションを指定してコンパイルすると拒否されます。

于 2009-10-20T19:39:28.917 に答える
1

C++1x では、ほぼどこでもブレースの初期化を使用できます。(ただし、fnieto の例では、Comeau 4.3.9 alpha がチョークします。)

于 2009-10-20T19:44:44.997 に答える