Еще один "кто прав, между 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 - опять же, если я правильно понимаю - код должен быть правильнымпотому что «Каждый шаблон-параметр» появляется один раз «вне не выводимого контекста».