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 中明确提供,所以我认为那里没有任何类型歧义。

这里有什么问题?是否有适当的方法来使用模板函数执行默认参数?

4

1 回答 1

3

您的示例不起作用,因为模板参数推导失败foo(). 使用 C++11,您可以为函数模板指定默认模板参数,因此您可以将定义更改为

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

对于 C++03,除了显式指定模板参数之外,我不知道任何其他方法。

模板参数不是从默认参数推导出来的原因是因为标准声明这是一个非推导上下文。

从 N3691,§14.8.2.5/5

未推断的上下文是:

...

— 在函数参数的参数类型中使用的模板形参,该函数参数有一个默认参数,该参数在进行参数推导的调用中使用。

于 2013-10-02T01:47:28.717 回答