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

Igo*_*gor 34 c++ language-lawyer c++11

我有以下代码:

int x = {{}};
Run Code Online (Sandbox Code Playgroud)

这种语法是否符合C++标准?(我对C++ 11及更高版本感兴趣.)

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

错误:在'int'类型的标量初始值设定项周围括起来

Rak*_*111 35

这是不正确的.gcc接受它是错误的,并且clang似乎允许它作为扩展,因为它警告它.

我将引用最新的草案,但它并没有什么不同.列表初始化按照[dcl.init.list]进行如下操作,其中T int在这种情况下:

  • 如果初始化列表是指定的初始化列表,[...] =>则不是
  • 如果T是一个聚合类[...] =>它不是
  • 如果T是一个字符数组[...] =>它不是.
  • 如果T是一个聚合[...] =>它不是(只有数组和类可以聚合)
  • 如果初始化列表没有元素[...] =>它没有
  • 如果T是std :: initializer_list [...] =>的特化,则不是
  • 如果T是类类型[...] =>则不是
  • 如果T是具有固定基础类型的枚举[...] =>则不是
  • 如果初始化列表具有E [...] =>类型的单个元素,则支持的初始化列表没有类型,因此没有
  • 如果T是参考类型[...] =>则不是
  • 如果初始化列表没有元素[...] =>它没有
  • 否则该计划是不正确的

  • +1并参见[核心语言问题1501](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1501),其遵循与此答案相同的逻辑,明确说明它无效. (4认同)