2017-02-24 5 views
3

私は、次のプログラム持っている:私はiためにはnへの参照ですので、私はテンプレート関数fは、テンプレートの種類Tためint&を取得する必要があることを期待していることを期待なぜC++テンプレートタイプの一致で参照修飾子 '&'が取得されないのですか?

#include<stdio.h> 
template<class T> void f(T t) { 
    t += 1; 
} 
template<class T> void g(T &t) { 
    t += 10; 
} 
int main() 
{ 
    int n=0; 
    int&i=n; 
    f(i); 
    g(i); 
    printf("%d\n",n); 
    return 0; 
} 

を。しかし、実際にはそうではありません。プログラムの出力は10で、私が期待した通り11ではありません。

だから私の質問はf、なぜT試合intではなく、変数iint&のため、ありますか?何がここにあるの?

ありがとうございました。

答えて

4

転送の参照を使用しない限り、テンプレートの減算は決して参照型を推論しません。従って、fgへの呼び出しでは、Tintと推定します。

また、式には参照型がありません。 inは同じです。彼らはタイプintと値カテゴリ左値を持っています。

コードint n = 0; int &i = n;は、decltype(1)を除いて、int i = 0; int &n = i;とまったく同じです。これは、2つの名前(in)を持つ1つのオブジェクトを作成します。

コードで転送参照を使用した場合でも、 template<class T>void h(T&&t)の場合、h(i)h(n)の呼び出しは同じ方法を推論します。

この対称性は、私がちょうど今行ったようにWhat is a reference?のmegathreadの現在の参照について多くのコメントが表示されていることを意味し、「参照は自動的に逆参照するポインタです」という誤解を招くことがあります。

関連する問題