考虑以下代码:
#include <iostream>
#include <type_traits>
using namespace std;
template<typename T_orig> void f(T_orig& a){
a=5;
}
template<typename T_orig, typename T=T_orig&> void g(T a){
a=8;
}
int main() {
int b=3;
f<decltype(b)>(b);
cout<<b<<endl;
g<decltype(b)>(b);
cout<<b<<endl;
return 0;
}
打印
5
5
有人可以向我解释为什么在第二个版本&
丢失了吗?
答案 0 :(得分:12)
这里的问题是类型推导优先于默认的函数模板参数。因此,您推导出T
参数,T
从不推断参考。
您可以通过输入not deducible类型来阻止此操作。通用身份类型特征可以做到这一点。
template <typename T>
struct identity { using type = T; };
template <typename T>
using NotDeducible = typename identity<T>::type;
template<typename T_orig, typename T=typename target<T_orig>::T>
void g(NotDeducible<T> a) { // blah
或者,在这种特殊情况下,您可以简单地完全删除模板参数。
template<typename T_orig> void g(typename target<T_orig>::T a)