Допустимо ли (имя типа из нескольких слов) {список-выражений}?

Учитывать:

(long long){1};

Это не выражение приведения в стиле C для [expr.cast]/1:

Результат выражения (T) cast-expression имеет тип T. Результатом является значение lvalue, если T является ссылочным типом lvalue, или ссылка rvalue на тип функции, и значение x, если T является ссылкой rvalue на тип объекта; в противном случае результатом будет prvalue.
литой-выражение: унарное выражение ( type-id ) приведение-выражение

{1} не должно быть литым выражением.

Это также не выражение приведения в функциональном стиле для [expr.type.conv]/1:

Спецификатор простого типа или спецификатор имени типа, за которым следует необязательный список-выражений в скобках или список-инициализации в фигурных скобках (инициализатор), создает значение указанного типа с учетом инициализатора. Если тип является заполнителем для выведенного типа класса, он заменяется возвращаемым типом функции, выбранной разрешением перегрузки для вывода шаблона класса для оставшейся части этого подпункта. В противном случае, если тип содержит тип-заполнитель, он заменяется типом, определяемым выводом типа-заполнителя ([dcl.type.auto.deduct]).
спецификатор простого типа: вложенный спецификатор имени opt имя типа шаблон спецификатора вложенного имени, простой идентификатор шаблона спецификатор decltype описатель типа заполнителя вложенный спецификатор имени opt имя-шаблона уголь char8_t char16_t char32_t wchar_t логический короткий инт длинный подписал неподписанный плавать двойной пустота

(long long) не должен быть спецификатором простого типа.

Это не кажется законным, но должно быть, почему?

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это недопустимый синтаксис в стандарте ISO C++.

В C это синтаксис составного литерала. Компиляторы по умолчанию часто поддерживают это также в режиме C++ в качестве расширения. При включении строгого (более) стандартного соответствия они должны отклонить его или, по крайней мере, предоставить предупреждение (например, с помощью -pedantic, -pedantic-errors)

Между прочим, не имеет значения, есть ли несколько слов. (long){1} такая же проблема. (/*..*/){/*..*/} не может быть синтаксисом для выражения, как видно из приведенных вами стандартных кавычек.

Кроме того, в C такой составной литерал является lvalue, как и строковые литералы. Это могло бы сбивать с толку в C++, где аналогичное выражение приведения, то есть T{1} с using T=long long;, дает значение prvalue. Время жизни полученного объекта также сильно отличается. Следовательно, их поддержка в C++ либо имела бы другое значение, чем в C, либо означала бы сбивающую с толку разницу между (T){e} и T{e}.

Вот закрытое предложение от 2020-2022 по внедрению составных литералов в C++. Как видно из результатов голосования, единого мнения о том, добавлять ли их вообще и какое поведение они должны иметь, не было.

Другие вопросы по теме