我可以在C ++中创建一个匿名的,大括号初始化的聚合吗?

时间:2009-10-20 19:37:29

标签: c++ aggregate initializer

可以创建一个通过构造函数参数初始化的匿名对象,例如在下面的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;
}

3 个答案:

答案 0 :(得分:8)

你不能在当前版本的C ++中。你将能够在C ++ 0x中 - 我相信无论如何。当然,它仍然可以修改 - 有一次我相信你能够在C ++ 0x中指定概念,但那已经消失......

编辑:引用将是N2960中的[dcl.init](§8.5/ 1)。最相关的位是BNF中'braced-init-list'的定义(以及该部分中描述的初始化可以/确实适用于返回值)。

答案 1 :(得分: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选项进行编译,它将拒绝它。

答案 2 :(得分:1)

您将能够在C ++ 1x中的任何地方使用大括号初始化。 (尽管在fnieto的例子中,Comeau 4.3.9 alpha扼杀了。)