2017-02-16 24 views
9

f(new int)f(const T&)代わりのf(const T*)に解決されるのはなぜ私は、関数の2つのオーバーロード非constポインタがconstのTへのconst T&過負荷を好む*

template <typename T> 
void f(const T&) { 
    cout << "f(T&)" << endl; 
} 

template <typename T> 
void f(const T*) { 
    cout << "f(T*)" << endl; 
} 

があると?このカウンター直感的な振る舞いについて、スタンダードのどこでも話し合っていますか?テンプレート控除とオーバーロードの解決のために

http://ideone.com/kl8NxL

+4

'F(に従って勝ち、任意の非恒等変換シーケンスのサブシーケンスであると考えられますnew int) '' T 'を 'int *'に設定し、 'T'を' int'に設定するのではなく 'f'(const T&)'に解決します。これは、署名付きの関数を呼び出しているかのようです。 'f(int * const&); ' –

+0

私はこの部分を知っていました。私の質問は、なぜ 'f(int * const&)'は 'f(const int *)'よりも良い一致ですか? –

答えて

13

、最初のステップは、テンプレートを解決することです。次に、テンプレート以外の順序が結果に適用されます。コードテンプレートの解像度は、次のとおり

void f(int * const &) // 1 

void f(int const *)  // 2 

C++ 14 [over.ics.ref]、引数に直接結合する基準によれば、(1)場合であっても(恒等変換あるとcv修飾子が追加されています)。 TT const &への結合は、直接的な結合であり、すなわち、一時的なものは作製されず、結合されていない。

ただし、(2)は修飾変換を含みます。引数タイプint *は、関数パラメータと一致する前にconst int *に変換する必要があります。

恒等変換ので、(1)サブシーケンス規則[over.ics.rank] /3.1.1

関連する問題