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

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)