GCC & Clang vs MSVC Ошибка при расширении пакета параметров шаблона в том же предложении параметров для шаблонов функций
Я наткнулся на следующее утверждение в :
Если параметр-шаблона является параметром -типом с многоточием перед его необязательным идентификатором или является объявлением параметра , объявляющим пакет ([dcl.fct]), то параметр-шаблона является пакетом параметров шаблона. Пакет параметров шаблона, представляющий собой объявление параметра , тип которого содержит один или несколько нерасширенных пакетов, является расширением пакета. ... Пакет параметров шаблона, который является расширением пакета, не должен расширять пакет параметров шаблона, объявленный в том же списке-параметров-шаблона.
(конец цитаты)
Итак, рассмотрим следующий недопустимый пример:
template<typename... Ts, Ts... vals> struct mytuple {}; //invalid
Приведенный выше пример недействителен, так как пакет параметров типа шаблона
Являются ли приведенные ниже примеры действительными/недействительными?
Затем я попробовал то же самое с шаблонами функций и ожидал такого же результата, но, к моему удивлению, он отлично компилируется в gcc и clang, но не в msvc. Пример выглядит следующим образом:
//is this valid?
template<typename... T, T... ar>
void func(){}
int main()
{
}
Точно так же приведенный ниже пример компилируется в gcc и clang, но не в msvc:
//is this valid?
template<typename...T, int (*FUNC)(T...)>
int wrapper(T... args) { return (*FUNC)(args...) * 10; }
int main()
{
}
Какой компилятор здесь? То есть относится ли стандартецитируемый оператор temp.param#17 к данным двум примерам, и поэтому они становятся недействительными, или цитата не применима к данным двум примерам.
1 ответ
Это ошибка в GCC и Clang. Вы написали явно определенный как недопустимый код, MSVC правильно выдает ошибку, а gcc и clang - нет. Поэтому MSVC правильный. GCC и Clang нет.
Кроме того, я запускал фрагменты кода в режиме MSVC C++20, и та же ошибка по-прежнему выдавалась. Это правильно обрабатывается с C++ 14 в MSVC и ошибка в GCC и Clang столько же времени.