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

plo*_*ong 5 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,是否可以类似地创建一个使用大括号初始化程序初始化的匿名聚合?例如,可以将f()的主体折叠到下面,直到单个return语句而没有"s"吗?

struct S {
  int i, j;
};

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

int main()
{
  cout << f().i << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 8

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

编辑:参考将是[dcl.init](第8.5节/ 1)N2960.最相关的位是BNF中'braced-init-list'的定义(以及文本的最后一位,表示该部分中描述的初始化可以/确实适用于返回值).


Ada*_*eld 5

不是在C++中.但是你可以在C99中使用所谓的复合文字:

struct S {
  int i, j;
};

struct S F()
{
  // Valid C99, invalid C++:
  return (struct S){ 52, 100 };
}
Run Code Online (Sandbox Code Playgroud)

[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选项进行编译,它将拒绝它.