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 中指定概念,但那已经不复存在了……

编辑:参考将是 N2960 中的 [dcl.init] (§8.5/1 )。最相关的部分是 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 中的几乎所有地方使用大括号初始化。(尽管 Comeau 4.3.9 alpha 扼杀了 fnieto 的示例。)

于 2009-10-20T19:44:44.997 回答