Тип фигурных скобок и неподписанные типы - PullRequest
0 голосов
/ 16 ноября 2018

gcc 8 и clang 7 не принимают следующий код, который должен по умолчанию создавать временный тип unsigned int:

unsigned int ui = unsigned int{};

clang 7 сообщает об ошибке, такой как

<source>:6:22: error: expected primary-expression before 'unsigned'

Visual C ++ 2015 и 2017 принимают это.

Очевидно, это работает с типом, таким как int, или любым типом класса, который может быть создан по умолчанию.

Это правильный код C ++ 14 (и в этом случае ошибка clang и gcc)? Если нет, то почему? Какие типы, кроме неподписанных, будут иметь такое же ограничение?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

new_type { expression-list(optional) } подобно unsigned int{} соответствует синтаксису явного преобразования типа , который допускает использование только однословного имени типа.

Имя типа, состоящее из одного слова, за которым следует фигурный список инициализации, является prvalue указанного типа designating a temporary (until C++17) whose result object is (since C++17), инициализируемый прямым списком с указанным фигурным списком инициализации.

Обратите внимание, что unsigned int не является именем типа из одного слова, в то время как int это. Так что int {} отлично работает.

То же самое для функционального выражения приведения ,

Функциональное выражение приведения состоит из простого спецификатора типа или спецификатора typedef (другими словами, имя типа из одного слова: unsigned int(expression) или int*(expression) недопустимы),

В качестве обходного пути вы можете применить псевдоним типа, например

using type = unsigned int;
type ui = type{};
0 голосов
/ 16 ноября 2018

«Int» является необязательным в «unsigned int».

Попробуйте просто:

unsigned ui = unsigned{};

Это работает.

Edit: Я нашел этот ответ: Стандартное поведение для прямой инициализации беззнакового шорта

Это просто потому, что в имени можно использовать только одно типовое имя функциональное выражение приведения, в то время как unsigned short не является одним словом имя типа; короткая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...