Является ли двустрочная скалярная инициализация, разрешенная стандартом C++?

У меня есть следующий код:

int x = {{}};

Является ли этот синтаксис действительным в соответствии со стандартом C++? (Меня интересуют C++ 11 и более поздние версии.)

При использовании последних компиляторов проблем нет, однако в некоторых более старых (например, GCC 4.8.5) возникает следующая ошибка:

error: скобки вокруг скалярного инициализатора для типа 'int'

Ответ 1

Это плохо сформировано. gcc ошибочно принимает его, и clang, кажется, позволяет ему как расширение, так как он предупреждает об этом.

Я собираюсь привести последний проект, но это не имеет никакого значения. Инициализация списка работает следующим образом [dcl.init.list], где T - int в этом случае:

  • Если список инициализаторов является назначенным списком инициализаторов, [...] => он не
  • Если T - совокупный класс [...] => это не
  • Если T - массив символов [...] =>, это не так.
  • Если T является агрегатом [...] => это не (только массивы и классы являются агрегатами)
  • Если в списке инициализаторов нет элементов [...] => это не
  • Если T является специализацией std :: initializer_list [...] => it not
  • Если T - тип класса [...] => это не
  • Если T является перечислением с фиксированным базовым типом [...] => it not
  • Если в списке инициализаций имеется один элемент типа E [...] =>, то в списке с инициализатором не будет никакого типа, поэтому нет
  • Если T является ссылочным типом [...] => это не
  • Если в списке инициализаторов нет элементов [...] => это не
  • В противном случае программа плохо сформирована