为什么 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.
的答案
如果我有一个函数模板,它的模板参数有默认参数,并且该函数采用类型参数的非默认参数,那么语言中允许永远不会使用的默认参数有什么意义? :
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.
的答案