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 :(得分:3)
您的示例不起作用,因为foo()
的模板参数推断失败。使用C ++ 11,您可以为函数模板指定默认模板参数,因此您可以将定义更改为
template<typename T = void*> void foo(T par = nullptr) {return;}
使用C ++ 03除了明确指定模板参数之外,我不知道任何其他方法。
不从默认参数推导出模板参数的原因是因为标准状态是非推断的上下文。
来自N3691,§14.8.2.5/ 5
未推断的上下文是:
...
- 在a的参数类型中使用的模板参数 函数参数,其中包含正在使用的默认参数 正在进行参数推断的调用。