0

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

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

ответ

1

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

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

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

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

С N3691, §14.8.2.5/5

В не-выведены контексты:

...

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

 Смежные вопросы

  • Нет связанных вопросов^_^