Lor*_*one 7 c++ templates reference c++11
考虑以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这打印
5
5
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么第二个版本&会丢失吗?
R. *_*des 12
这里的问题是类型推导优先于默认的函数模板参数.因此,您可以获得T推导出的参数,并且T永远不会推导出参考.
您可以通过使类型不可推断来防止这种情况.通用标识类型特征可以执行此操作.
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
Run Code Online (Sandbox Code Playgroud)
或者,在这种特殊情况下,您可以简单地完全删除模板参数.
template<typename T_orig> void g(typename target<T_orig>::T a)
Run Code Online (Sandbox Code Playgroud)