C ++标准允许双括号标量初始化吗?

时间:2018-08-29 10:34:24

标签: c++ c++11 language-lawyer

我有以下代码:

int x = {{}};

此语法根据C ++标准是否有效? (我对C ++ 11及更高版本感兴趣。)

使用最新的编译器时没有问题,但是在某些较旧的编译器(例如GCC 4.8.5)中,会出现以下错误:

  

错误:类型为'int'的标量初始值设定项大括号

1 个答案:

答案 0 :(得分:35)

这是错误的形式。 gcc接受它是错误的,而clang似乎允许它作为扩展名,例如it warns about it

我要引用最新的草稿,但这没什么不同。根据{{​​3}},列表初始化的工作方式如下,其中T在这种情况下为int

  • 如果初始化列表是指定的初始化列表,则[...] =>不是
  • 如果T是聚合类[...] =>则不是
  • 如果T是字符数组[...] =>则不是。
  • 如果T是一个聚合[...] =>则不是(仅数组和类可以是聚合)
  • 如果初始化列表中没有元素[...] =>则没有
  • 如果T是std :: initializer_list [...] =>的特化,则不是
  • 如果T是类类型[...] =>则不是
  • 如果T是具有固定基础类型[...] =>的枚举,则不是
  • 如果初始化列表只有一个类型为E [...]的元素,则支撑列表没有类型,所以没有
  • 如果T是引用类型[...] =>则不是
  • 如果初始化列表中没有元素[...] =>则没有
  • 否则程序格式错误