Очередной "кто прав между g++ и clang++?" вопрос к стандартным гуру.
Учитывая следующий тривиальный код
#include <utility>
template <std::size_t N, typename = std::make_index_sequence<N>>
struct foo;
template <std::size_t...Is>
struct foo<sizeof...(Is), std::index_sequence<Is...>>
{ };
int main ()
{
foo<3u> f;
(void)f; // just to avoid the "unused variable" warning
}
У меня этот clang++ компилируется без проблем (clang++ 9.0.0, например, но и более старые версии), где g++ (g++ 9.2.0, например, но также и более старые версии) дает мне следующую ошибку компиляции
prog.cc:8:8: error: template argument 'sizeof... (Is)' involves template parameter(s)
8 | struct foo<sizeof...(Is), std::index_sequence<Is...>>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Как всегда вопрос: кто прав?
Или, другими словами: правильный ли мой пример кода?
-- ИЗМЕНИТЬ--
Что касается другого вопроса, я полагаю, что это связано, но я не думаю, что это точная копия.
На самом деле clang++ не компилирует код в этом вопросе, скомпилируйте этот код.
В противном случае ошибка g++ такая же, и, если я правильно понимаю, принятый ответ на этот вопрос может быть ответом и на этот вопрос.
После этого ответа, если я правильно понимаю, код неверен до cwg 1315, потому что «частично специализированное выражение аргумента нетипа» (sizeof...(Is)
) включает «параметр шаблона частичной специализации», который не является «простым идентификатором».
После cwg 1315 -- опять же, если я правильно понимаю -- код должен быть правильным, потому что "Каждый параметр-шаблон" появляется один раз "вне невыведенного контекста".