вариационное расширение нулевой длины плохо сформированного вызова

Вопрос к стандартным гуру.

Пытаясь ответить на Другой вопрос, Я усомнился в правильности кода.

Насколько я знаю, следующий код некорректен

int main ()
{
std::tuple<>  a;

std::get<0>(a);
}

потому что вызов std::get<I>(t), когда t это std::tuple<Ts...>, плохо сформирован, когда I вне диапазона [0, sizeof...(Ts)[,

В этом случае sizeof...(Ts) ноль, поэтому диапазон [0, 0[ пусто, так std::get<I>(a) плохо сформирован для каждого индекса I,

Но когда std::get<I>(a) раскрывается через пустую пачку?

Я имею в виду: следующий код

#include <tuple>

template <typename ... Args>
void bar (Args const & ...)
{ }

template <std::size_t ... I>
void foo ()
{
std::tuple<> a;

bar( std::get<I>(a) ... );
}

int main ()
{
foo<>();
}

который использует плохо сформированный (?) вызов (std::get<I>(a)) но вариативное расширение с нулевым временем расширено (sizeof...(I) равен нулю), хорошо сформирован или плохо сформирован?

3

Решение

[Temp.res] / 8:

Программа некорректна, диагностика не требуется, если:

  • […]
  • каждая действительная специализация шаблона с переменными параметрами требует пустой пакет параметров шаблона, или
  • […]
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]