考虑
#include <iostream>
#include <type_traits>
template <class T, class ARG_T = T&>
T foo(ARG_T v){
return std::is_reference<decltype(v)>::value;
}
int main() {
int a = 1;
std::cout << foo<int>(a) << '\n';
std::cout << foo<int, int&>(a) << '\n';
}
我希望这两种情况下的输出都是 1。但在第一种情况下,它是 0:与默认值 class ARG_T = T
而不是 class ARG_T = T&
一致。
我错过了什么?
最佳答案
对于foo<int>(a)
, ARG_T
是从 a
推导出来的,并且不是从默认模板参数中获取的。因为它是一个按值函数参数,并且 a
是 int
类型的表达式,推导为int
.
一般来说,当模板实参推导可以发现实参是什么时,不使用默认模板实参。
但是我们可以通过为函数参数引入非推导上下文来强制使用默认参数。例如:
template <class T, class ARG_T = T&>
T foo(std::enable_if_t<true, ARG_T> v1){
//...
}
或者 C++20 type_identity
实用程序,如其他答案所示。
关于c++ - 模板默认参数丢失其引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57820195/