Различное поведение создания экземпляра шаблона функции с использованием разных компиляторов.C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Различное поведение создания экземпляра шаблона функции с использованием разных компиляторов.

Сообщение Гость »

Описание
Вот фрагмент кода, который по-разному обрабатывается компиляторами 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 определяемым пользователем преобразованием или нет? [*]Какой компилятор (или версии компилятора) является правильным со стандартной точки зрения? [*]Какие параграфы стандарта определяют правильное поведение?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»