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

誰かが私に2番目のバージョンでなぜ&失われるのか説明できますか?

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 に答える