2016-08-12 10 views
9

あいまいなエラーを報告する代わりに、オーバーロードの解像度が第2の関数を選択する理由を説明することができます。とにかく、2番目の関数は完全一致ですが、1番目は修飾変換(char *からconst char *へ)されます。ただし、http://en.cppreference.com/w/cpp/language/overload_resolution
の文書では、修飾変換も完全一致であるため、両方の候補が同じランク付けを持つ必要があります。完全一致のC++関数オーバーロード

標準変換シーケンスの各タイプは、3つのランクのいずれかが割り当てられる。

1)完全一致:いいえ変換に必要な、左辺値対右辺値変換、資格変換、関数ポインタ変換、(C +以来+17)ユーザ定義の同じクラスにクラスタイプの変換

2)促進:積分プロモーション、浮動小数点促進

3)変換:積分変換、浮動小数点変換、浮動積分変換を、ポインタ変換、ポインタへのポインタERそのベースへの変換、ブール変換、派生クラスのユーザ定義の変換

void g(const char* x) 
{ 
    std::cout << "g(const char* x)" << std::endl; 
} 

void g(char* x) 
{ 
    std::cout << "g(char* x)" << std::endl; 
} 

void callg() 
{ 
    char a[] = "sample"; 
    g(a); 
} 

答えて

8

両方の関数は、アレイへのポインタ変換を必要とするが、最初は、追加の資格変換を必要とします。

あなたは両方が完全に一致していることを言っているに正しい

[over.ics.scs]/3

[...]変換シーケンスのランクを考慮して決定されます配列中の各変換のランクおよび任意の参照結合のランク(13.3.3.1.4)。それらのいずれかに変換ランクがある場合、そのシーケンスには変換ランクがあります。そうでない場合、プロモーションランクを持つランクのいずれかがあれば、プロモーションランクが設定されます。そうでなければ、完全一致ランクを持つ。

場合

しかし[over.ics.rank]/3.2

標準変換シーケンスS1の規則に従って[標準変換シーケンスS2よりも良好な変換シーケンスであります... ]

(3.2.5) - S1およびS2は修飾修飾のみが異なり、同様の型をもたらす。T1およびT2(4.4)であり、T1のcv-qualification署名は、タイプT2のcv-qualification署名の適切なサブセットです。

同じルールを使用すると、標準の変換シーケンスS1は標準変換シーケンスより優れてある

3)「暗黙の型変換シーケンスのランキング」の下にリンク先のページにあるS2

場合

[...]

F)、またはそうでない場合はそれを、S1S2のみ資格変換で異なり、S1の結果のCV-資格はS2

+0

私は「どちらも完全一致です」と言うのは正しいですか?理解できませんでした。 –

+0

@ GilsonPJ必要な変換(配列からポインタへの変換と修飾)のランクは完全一致です。したがって、全体の変換シーケンスも完全一致です。 – user657267

+0

@Gilson:基本的に、両方とも完全一致で同じランクを持っていますが、cv-qualificationに関する特別なルールはそれを上回り、#2の優先順位を与えます。要するに**それはちょうど**です。 –

0
の結果のCV-資格のサブセットであります

過負荷解析では、T *とconst T *は別個のパラメータタイプと見なされます。 [over.load] 13.1 /(3.4):特に

は、任意のタイプTのために、 "Tへのポインタ"、 "TをCONSTへのポインタ"、および "揮発性Tへのポインタ" が別個のパラメータであると考えられます「Tへの参照」、「const Tへの参照」、および「揮発性Tへの参照」のように、型を定義します。