7

考虑这段代码:

#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

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

4

1 回答 1

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

或者,在这种特殊情况下,您可以完全摆脱模板参数。

template<typename T_orig> void g(typename target<T_orig>::T a)
于 2012-11-29T16:56:20.570 回答