我注意到看起来我不能像我期望的那样使用默认参数作为缩写函数模板。
#include <iostream>
auto f(const auto x = 0) {
return x + sizeof(x);
}
int main() {
std::cout << f() << std::endl; // << broken
std::cout << f(0) << std::endl;
std::cout << f(short(8470)) << std::endl;
}
这是什么原因?
我的猜测是模板机制从不查看默认参数,所以我们得到了这种荒谬的情况,我可以定义一个模板化函数,看起来它默认为 T=int
(其中 T
是隐藏的模板类型),但似乎无法在不手动指定类型的情况下调用它:( f<int>()
)。
这主要是语言琐事,我不认为这是一个真正的问题,但函数模板没有 int
看起来确实很奇怪™作为默认模板类型。
最佳答案
你和模板有同样的问题:
template<class T>
auto f(const T x = 0) {
return x + sizeof(x);
}
我的猜测是为 auto
参数所做的转换本质上是上面的代码。
要让它工作,你必须指定 T 的默认模板类型:
template<class T = int>
auto f(const T x = 0) {
return x + sizeof(x);
}
虽然缩写模板很有用,但当您需要更多控制时,您必须使用模板。例如,如果您有一个具有多个必须是同一类型的参数的函数,也会出现这种情况。
关于c++ - 缩写函数模板的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68855406/