C ++
Ни одна из этих функций шаблона
template<typename T> void foo(T par = nullptr) {return;} //#1
template<typename T> void foo(T par = std::nullptr_t(nullptr)) {return;} //#2
template<typename T> void foo(T par = int(0)) {return;} //#3
разрешить что-либо с помощью следующего вызова с нулевым аргументом для компиляции:
foo();
хотя звоню foo
с любой ценностью работает (например, foo(2)
).
nullptr
имеет определенный тип, который std::nullptr_t
, поэтому я не думаю, что для параметра по умолчанию требуется дополнительная квалификация типа в # 1. Тип параметра по умолчанию явно указан в # 2 и # 3, так что я не думал, что там была какая-то неоднозначность типа.
Что здесь не так? Есть ли правильный способ сделать параметры по умолчанию с функциями шаблона?
Ваши примеры не работают, потому что вывод аргумента шаблона не удается для foo()
, В C ++ 11 вам разрешено указывать аргументы шаблона по умолчанию для шаблонов функций, поэтому вы меняете определение на
template<typename T = void*> void foo(T par = nullptr) {return;}
С C ++ 03 я не знаю другого способа, кроме как явно указать аргумент шаблона.
Причина, по которой аргумент шаблона не выводится из аргумента по умолчанию, заключается в том, что стандарт утверждает, что это не выводимый контекст.
От N3691, §14.8.2.5 / 5
Неведуемые контексты:
…
— параметр шаблона, используемый в типе параметра
параметр функции, который имеет аргумент по умолчанию, который используется в
вызов, для которого производится вывод аргумента.
Других решений пока нет …