g ++ и clang ++ различное поведение со специализацией шаблона для значения шаблона sizeof ... () - PullRequest
3 голосов
/ 26 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...