Допускается ли скалярная инициализация в двойных скобках по стандарту C ++? - PullRequest
0 голосов
/ 29 августа 2018

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

int x = {{}};

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

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

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

1 Ответ

0 голосов
/ 29 августа 2018

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

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

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