如果不直接使用,模板参数会丢失左值引用

时间:2012-11-29 16:41:52

标签: 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;
}

打印

5
5

有人可以向我解释为什么在第二个版本&丢失了吗?

1 个答案:

答案 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)