Описание
Вот фрагмент кода, который по-разному обрабатывается компиляторами clang, gcc и msvc:
#include шаблон структура enum_as_byte_check; шаблон структура [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; шаблон используя is_scoped_enum = std::integral_constant; шаблон класс enum_as_byte { typedef enum_as_byte_check Проверить; }; шаблон статическая встроенная пустая полоса (const EnumT) { } шаблон статическая встроенная пустая полоса (enum_as_byte) { static_assert(ложь && ""); } класс перечисления Foo: int {}; перечисление Бар {}; static_assert(is_scoped_enum::value); static_assert(!is_scoped_enum::value); интервал основной() { бар(Foo{}); } Результаты (ссылки ведут на соответствующие настройки Compiler Explorer):
[*]
x86-64 clang 17.0.1:
:13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] 13 | typedef enum_as_byte_check Проверить; | ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь 35 | бар(Foo{}); | ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] 35 | бар(Foo{}); | ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший 5 | [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; | ^ 1.1. если bar(Foo{}); комментируется: предупреждений нет
[*]
x86-64 clang 16.0.0:
:25:5: ошибка: статическое утверждение не выполнено из-за требования 'false && ""' static_assert(ложь && ""); ^ ~~~~~~~~~~~ :13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] typedef enum_as_byte_check Проверить; ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь бар(Foo{}); ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] бар(Foo{}); ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; ^ 2.1. если static_assert закомментирован:
:13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] typedef enum_as_byte_check Проверить; ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь бар(Foo{}); ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] бар(Foo{}); ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; ^ 2.2. если bar(Foo{}); закомментирован, а static_assert нет:
:25:5: ошибка: статическое утверждение не удалось из-за требования 'false && ""' static_assert(ложь && ""); ^ ~~~~~~~~~~~ 2.3, если оба bar(Foo{}); и static_assert закомментированы:: никаких предупреждений
[*]
x86-64 gcc 13.1/13.2: предупреждений нет
[*]
x86-64 gcc 12.3:
: В функции void bar(enum_as_byte)': :25:25: ошибка: не удалось выполнить статическое утверждение 25 | static_assert(ложь && ""); | ~~~~~~^~~~~ 4.1. тот же вывод, если bar(Foo{}()); закомментирован
4.2. нет предупреждений, если static_assert прокомментирован [*]
x86 MSVC v19.latest: предупреждений нет
Вопросы: [*]Считается ли enum_as_byte в определении bar определяемым пользователем преобразованием или нет? [*]Какой компилятор (или версии компилятора) является правильным со стандартной точки зрения? [*]Какие параграфы стандарта определяют правильное поведение?
Различное поведение создания экземпляра шаблона функции с использованием разных компиляторов. ⇐ C++
Программы на C++. Форум разработчиков
1696076709
Гость
Описание
Вот фрагмент кода, который по-разному обрабатывается компиляторами clang, gcc и msvc:
#include шаблон структура enum_as_byte_check; шаблон структура [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; шаблон используя is_scoped_enum = std::integral_constant; шаблон класс enum_as_byte { typedef enum_as_byte_check Проверить; }; шаблон статическая встроенная пустая полоса (const EnumT) { } шаблон статическая встроенная пустая полоса (enum_as_byte) { static_assert(ложь && ""); } класс перечисления Foo: int {}; перечисление Бар {}; static_assert(is_scoped_enum::value); static_assert(!is_scoped_enum::value); интервал основной() { бар(Foo{}); } Результаты (ссылки ведут на соответствующие настройки Compiler Explorer):
[*]
x86-64 clang 17.0.1:
:13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] 13 | typedef enum_as_byte_check Проверить; | ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь 35 | бар(Foo{}); | ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] 35 | бар(Foo{}); | ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший 5 | [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; | ^ 1.1. если bar(Foo{}); комментируется: предупреждений нет
[*]
x86-64 clang 16.0.0:
:25:5: ошибка: статическое утверждение не выполнено из-за требования 'false && ""' static_assert(ложь && ""); ^ ~~~~~~~~~~~ :13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] typedef enum_as_byte_check Проверить; ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь бар(Foo{}); ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] бар(Foo{}); ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; ^ 2.1. если static_assert закомментирован:
:13:10: предупреждение: 'enum_as_byte_check' устарело: устаревшее предупреждение [-Wdeprecated-declarations] typedef enum_as_byte_check Проверить; ^ :35:14: примечание: при создании экземпляра класса шаблона 'enum_as_byte', запрошенного здесь бар(Foo{}); ^ :35:5: примечание: при подстановке выведенных аргументов шаблона в шаблон функции 'bar' [с EnumT = Foo] бар(Foo{}); ^ :5:3: примечание: 'enum_as_byte_check' здесь явно помечен как устаревший [[deprecated("устаревшее предупреждение")]] enum_as_byte_check {}; ^ 2.2. если bar(Foo{}); закомментирован, а static_assert нет:
:25:5: ошибка: статическое утверждение не удалось из-за требования 'false && ""' static_assert(ложь && ""); ^ ~~~~~~~~~~~ 2.3, если оба bar(Foo{}); и static_assert закомментированы:: никаких предупреждений
[*]
x86-64 gcc 13.1/13.2: предупреждений нет
[*]
x86-64 gcc 12.3:
: В функции void bar(enum_as_byte)': :25:25: ошибка: не удалось выполнить статическое утверждение 25 | static_assert(ложь && ""); | ~~~~~~^~~~~ 4.1. тот же вывод, если bar(Foo{}()); закомментирован
4.2. нет предупреждений, если static_assert прокомментирован [*]
x86 MSVC v19.latest: предупреждений нет
Вопросы: [*]Считается ли enum_as_byte в определении bar определяемым пользователем преобразованием или нет? [*]Какой компилятор (или версии компилятора) является правильным со стандартной точки зрения? [*]Какие параграфы стандарта определяют правильное поведение?
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия