я недавно создал этот пример кода для иллюстрирования C++ 11 шаблонов variadic функциональное использование.
template void foo (Head, Tail...);
template void foo (int, Tail...);
void foo () {}
template
void foo (int x, Tail... tail)
{
std :: cout << "int:" << x;
foo (tail...);
}
template
void foo (Head x, Tail... tail)
{
std :: cout << " ?:" << x;
foo (tail...);
}
foo (int (123), float (123)); // Prints "int:123 ?:123.0"
, Если первые две строки, которые передают - объявляют , нечто
опущены затем, это печатает int:123int:123
вместо этого. Это удивило определенного опытного и хорошо осведомленного программиста на C++.
Он был убежден, что предописания не должны быть необходимыми, потому что корпус не инстанцируют до второй фазы двухфазного поиска. Он думает, что компилятор (gcc 4.6) имеет ошибку.
я полагаю, что компилятор является правильным, потому что два нечто
, различные основные шаблонные функции и выбор основного шаблона должны быть заблокированы - в во время первой фазы, или иначе вы могли нарушить правило с одним определением путем инстанцирования нечто
, прежде чем все версии его были определены, и с другой стороны впоследствии (рассмотрите, как компоновщик предполагает, что избыточные шаблонные определения функции являются идентичными, взаимозаменяемыми, и отбрасываемыми).
Так, кто прав?
вышеупомянутое - сослалось, GOTW приятно объясняет, как и почему шаблоны функций частично не специализируются, но существование шаблонных функций variadic, кажется, добавляет к беспорядку - интуиция, что нечто
должен быть частичной специализацией нечто
более силен, чем та интуиция для функций non-variadic, по крайней мере, мне.