【问题标题】:Template function default parameter and type inference模板函数默认参数和类型推断
【发布时间】:2013-10-02 01:30:59
【问题描述】:

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

这里有什么问题?有没有合适的方法来使用模板函数做默认参数?

【问题讨论】:

    标签: c++ templates type-inference default-parameters template-function


    【解决方案1】:

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

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

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

    没有从默认参数推导出模板参数的原因是因为标准规定这是一个非推导上下文。

    来自 N3691,§14.8.2.5/5

    未推断的上下文是:

    ...

    — 用于参数类型的模板参数 具有正在使用的默认参数的函数参数 正在进行参数推导的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 2021-11-01
      • 2019-09-12
      • 1970-01-01
      • 2016-07-16
      • 2023-03-31
      • 2021-12-22
      • 2016-10-11
      相关资源
      最近更新 更多