Необходимость вперед объявляющих шаблонных функций

я недавно создал этот пример кода для иллюстрирования 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, по крайней мере, мне.

19
задан spraff 31 August 2011 в 09:50
поделиться