Контекст: я переписываю библиотеку, которая работала с G CC -fconcepts, на C ++ 20. Clang 10 и G CC 10 вызывают у меня ту же неожиданную проблему, так что, вероятно, это моя ошибка.
У меня есть шаблон класса, который поддерживает два случая. Он может быть создан либо из списка pin_out, либо из списка port_out.
template< typename T > concept pin_out = T::is_pin_out;
template< typename... Ts > concept pin_out_list = ( pin_out< Ts > && ... );
template< typename T > concept port_out = T::is_port_out;
template< typename... Ts >
requires pin_out_list< Ts...> || ( port_out< Ts > && ... )
struct port;
Когда я пишу специализацию для списка pins_out с концепциями TS, я могу написать
template< pin_out_list... Ts >
struct port< Ts... > {};
но теперь с C ++ 20 компиляторы жалуются, что специализация не более ограничена, чем базовая. Когда я добавляю условие require, оно компилируется.
template< pin_out_list... Ts >
requires pin_out_list< Ts... >
struct port< Ts... > {};
И я могу удалить pin_out_list ... из заголовка шаблона.
template< typename... Ts >
requires pin_out_list< Ts... >
struct port< Ts... > {};
Является ли pin_out_list ... в специализация теперь молча игнорируется?
проверить это на проводнике компилятора