Параметр шаблона по умолчанию и вывод типа

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, так что я не думал, что там была какая-то неоднозначность типа.

Что здесь не так? Есть ли правильный способ сделать параметры по умолчанию с функциями шаблона?

0

Решение

Ваши примеры не работают, потому что вывод аргумента шаблона не удается для foo(), В C ++ 11 вам разрешено указывать аргументы шаблона по умолчанию для шаблонов функций, поэтому вы меняете определение на

template<typename T = void*> void foo(T par = nullptr) {return;}

С C ++ 03 я не знаю другого способа, кроме как явно указать аргумент шаблона.

Причина, по которой аргумент шаблона не выводится из аргумента по умолчанию, заключается в том, что стандарт утверждает, что это не выводимый контекст.

От N3691, §14.8.2.5 / 5

Неведуемые контексты:

— параметр шаблона, используемый в типе параметра
параметр функции, который имеет аргумент по умолчанию, который используется в
вызов, для которого производится вывод аргумента.

3

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

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

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