Вопрос к стандартным гуру.
Пытаясь ответить на Другой вопрос, Я усомнился в правильности кода.
Насколько я знаю, следующий код некорректен
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)
равен нулю), хорошо сформирован или плохо сформирован?
Программа некорректна, диагностика не требуется, если:
- […]
- каждая действительная специализация шаблона с переменными параметрами требует пустой пакет параметров шаблона, или
- […]
Других решений пока нет …