我能否在C++中创建一个匿名的、用花括号初始化的聚合体?

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”的单个返回语句?
struct S {
  int i, j;
};

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

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

当然,看起来答案将是“不”。 - plong
3个回答

8
在当前版本的C++中无法实现,但是在C++ 0x中将能够实现--我想是这样。当然,这仍然可以进行修改--曾经我认为你可以在C++ 0x中指定概念,但那已经不存在了...
编辑:参考文献是[dcl.init](§8.5 / 1)在N2960中。最相关的部分是BNF中“braced-init-list”的定义(以及最后一部分文字,表明该部分描述的初始化可以/适用于返回值)。

+1 @Jerry。没错,但是它在§8.5.4/1中。你漏掉了一个数字。 - Fernando N.
我看的是§8.5/1部分(足以回答当前问题)。然而,你说得对,§8.5.4/1是专门涵盖大括号初始化列表的,它有更多关于它们的详细信息。 - Jerry Coffin

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选项进行编译,则会拒绝它。

1

在C++1x中,您几乎可以在任何地方使用花括号初始化。(尽管Comeau 4.3.9 alpha对fnieto的示例无法处理。)


虽然它不会在今年发布,但为了大家的理智着想,最好仍然称其为C++ 0x。正如您所期望的那样,以“0x”作为前缀,数字将是十六进制的。 @sbi:你是对的。上面引用的草案... - Jerry Coffin
@Jerry:请阅读我在 https://dev59.com/bnI_5IYBdhLWcg3wEe1u 的评论。 - sbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接