шаблон, правильная форма и правило нулевой длины упаковки

Из принятого ответа предыдущий вопрос Я обнаружил правило Я не знал о шаблонах и правильной форме

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

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

Согласно этому правилу (если я правильно понимаю), следующая функция шаблона плохо сформирована

template <typename ... Ts>
int foo (std::tuple<Ts...> const &)
{ return std::get<sizeof...(Ts)>(std::tuple<int>{42}); }

потому что единственная действительная специализация требует и пуста Ts... пакет параметров.

Но (возможно, потому что я не очень хорошо знаю английский), я не уверен, что пойму это правило в случае шаблона с двумя или более пакетами параметров.

Я имею в виду … следующее foo() функция

#include <tuple>
#include <iostream>

template <typename ... Ts, typename ... Us>
int foo (std::tuple<Ts...> const &, std::tuple<Us...> const &)
{ return std::get<sizeof...(Ts)+sizeof...(Us)-1U>(std::tuple<int>{42}); }

int main ()
{
auto t0 = std::tuple<>{};
auto t1 = std::tuple<int>{0};

//std::cout << foo(t0, t0) << std::endl; // compilation error
std::cout << foo(t0, t1) << std::endl;   // print 42
std::cout << foo(t1, t0) << std::endl;   // print 42
//std::cout << foo(t1, t1) << std::endl; // compilation error
}

хорошо сформирован или плохо сформирован?

Поскольку действительная специализация этого требует, чтобы Ts... или же Us... пусто (и что другой пакет параметров точно имеет размер 1).

Правило следует интерпретировать в том смысле, что программа является плохо сформированной, если существует пустой пакет параметров, который должен быть всегда пустым (поэтому мой пример должен быть правильно сформирован, поскольку оба пакета параметров могут быть не пустыми) или в том смысле, что плохо сформирован, если в каждой специализации есть хотя бы пустой пакет параметров, не обязательно одинаковый в каждой специализации (поэтому мой пример должен быть некорректно сформирован)?

4

Решение

Задача ещё не решена.

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

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

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