2017-08-08 24 views
0

はC++入門第5版から1つの運動です:テンプレート関数パラメータ控除

template<typename T> 
void f1(T, T){} 
int i = 0, *p1 = &i; 
const int *cp1 = &i; 

f1(p1, cp1); 

は、しかし、コンパイラはエラーを生成します。

no matching function for call to 'f1(int*&, const int*&)' 

私はエラーがポイントの参照を含める理由はわかりませんか?私は、パラメータの減算は 'f1(int *、const int *)'だと思います。

答えて

3

これはGCCが引数が左辺値であることを示しています。引数の型がT&と表示されている場合、引数の型がTで左辺です。引数の型がT(非参照)と表示されている場合、引数の型がTであり、rvalueであることを意味します。

+0

このルールは**のみ**パラメータタイプが*ユニバーサルリファレンス*の場合は適用されますか? –

+0

@DeanSeo私はあなたが理解したとは思わない。私の答えはテンプレート引数の控除とは関係ありません。 GCCが診断メッセージに特定の情報を表示する方法を選択するだけです。 – Brian

+0

申し訳ありません。うん、もう一度それを読んで、あなたは正しい。 :) +1。 –

関連する問題