Частичная специализация шаблона класса с нетиповым параметром шаблона decltype(auto) ⇐ C++
Частичная специализация шаблона класса с нетиповым параметром шаблона decltype(auto)
В следующем примере программы шаблон класса с нетиповым параметром шаблона decltype(auto) частично специализирован с нетиповым параметром шаблона auto: шаблон struct A { static const int v = 0; }; шаблон struct A { static const int v = 1; }; и это принимается всеми компиляторами, только GCC выдает предупреждение
предупреждение: частичная специализация 'struct A' не более специализирована, чем примечание: основной шаблон 'template struct A' Являются ли следующие утверждения истинными (как в Clang)?
const int i = 0; static_assert( A::v == 1); //ок везде static_assert( A::v == 0);//ОК только в Clang Насколько я понимаю, здесь A в Clang выбирает основной шаблон класса с параметром типа const int&, поэтому A ::v == 0. А A в Clang выбирает специализацию с помощью параметра типа int, поэтому A::v == 1.
Но GCC и MSVC с этим не согласны и выбирают специализацию в обоих случаях, поэтому A::v == 1. Онлайн-демо: https://godbolt.org/z/Wfd8e1KPz
Какой компилятор здесь правильный по стандарту?
В следующем примере программы шаблон класса с нетиповым параметром шаблона decltype(auto) частично специализирован с нетиповым параметром шаблона auto: шаблон struct A { static const int v = 0; }; шаблон struct A { static const int v = 1; }; и это принимается всеми компиляторами, только GCC выдает предупреждение
предупреждение: частичная специализация 'struct A' не более специализирована, чем примечание: основной шаблон 'template struct A' Являются ли следующие утверждения истинными (как в Clang)?
const int i = 0; static_assert( A::v == 1); //ок везде static_assert( A::v == 0);//ОК только в Clang Насколько я понимаю, здесь A в Clang выбирает основной шаблон класса с параметром типа const int&, поэтому A ::v == 0. А A в Clang выбирает специализацию с помощью параметра типа int, поэтому A::v == 1.
Но GCC и MSVC с этим не согласны и выбирают специализацию в обоих случаях, поэтому A::v == 1. Онлайн-демо: https://godbolt.org/z/Wfd8e1KPz
Какой компилятор здесь правильный по стандарту?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Частичная специализация шаблона вариативного шаблона C++ с помощью std::enable_if
Anonymous » » в форуме C++ - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Частичная специализация шаблона класса для константных и неконстантных указателей
Anonymous » » в форуме C++ - 0 Ответы
- 67 Просмотры
-
Последнее сообщение Anonymous
-