Из принятого ответа на предыдущий вопрос я обнаружил правило Я не знал о шаблонах и корректности
Программа некорректна, диагностика не требуется, если:
- [...]
- для каждой допустимой специализации вариативного шаблона требуется пустой пакет параметров шаблона, или
- [...]
В соответствии с этим правилом (если я правильно понимаю) следующая шаблонная функция некорректна
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).
Правило следует интерпретировать в том смысле, что программа плохо сформирована, если есть пустой пакет параметров, который должен быть всегда пустым (поэтому мой пример должен быть правильно сформирован, потому что оба пакета параметров могут быть непустыми) или в том смысле, что неправильно сформирован, если в каждой специализации есть хотя бы пустой пакет параметров, не обязательно одинаковый в каждой специализации (поэтому мой пример должен быть неправильно сформирован)?
template<int V, typename...> class foo{};
какfoo<0>
иfoo<1>
сделает программу неправильно сформированной, поскольку для обеих специализаций потребуется пустой пакет параметров шаблона. - person user7860670   schedule 30.09.2017foo()
(два закомментированных) в моем примере вызывают четыре (две) специализацииfoo()
. Вы согласны? (извините, но мне нужно идти, и я уезжаю на несколько часов) - person max66   schedule 30.09.2017foo()
, называется (неявным) созданием экземпляров. Специализация относится к предоставлению альтернативного определения основному шаблону. - person Passer By   schedule 30.09.2017