为什么 C++ 允许永远不能使用的默认模板参数?

Why c++ allows default template argument that can never be used?

如果我有一个函数模板,它的模板参数有默认参数,并且该函数采用类型参数的非默认参数,那么语言中允许永远不会使用的默认参数有什么意义? :

template <class T = int>
void foo(T x){cout << x << endl;}

int main()
{

    foo("hi"); // T is char const *
    foo(); // error
}

如您所见,永远无法使用 T=int,因为该函数没有默认参数,因此此上下文中的编译器总是从传递给 [的参数中推断出 T 的类型=13=].

但是可以使用。这是一个例子。

auto* foo_ptr = &foo<>; // The default template argument is used.

函数调用表达式并不是需要计算函数模板参数的唯一上下文。

虽然默认参数通常用于非推导参数,但获取函数地址 (&foo) 也会使用它们。

另一个例子:

#include <typeinfo>
#include <iostream>
using namespace std;

template <class T = int>
void coutType() {
    cout << typeid(T).name() << endl;
}

int main() {
    // default
    coutType();
    // non-default
    coutType<double>();
}

用 Clang++ 输出

int
double

what's the point in the language to allow [X]?

更好:禁止 [X] 有什么意义?

简单是有价值的。我会将举证责任交给想要使语言更复杂的一方。该语言允许模板参数具有默认值。该语言允许在直接调用函数时推导模板参数。允许这些 co-exist 比添加禁止使用两者更简单。因此我会问为什么禁止,而不是问为什么允许。如果没有令人信服的复杂原因,则坚持简单。被允许做某事并不强迫一个人去做。也许有人(比如 StoryTeller 和 Dani)会发现它的用途。

当然,简单不是最终标准。如果伤害来自 [X],那么这可能会超过简单性问题。并发症是有道理的。但是,不能因为看起来没用就引入并发症。

另一方面,可以合理地询问是否可以使用 [X]。也许这才是真正的问题,即使 OP 没有意识到这一点。不过,我想我会提出一个解决 question-as-phrased.

的答案