あいまいなエラーを報告する代わりに、オーバーロードの解像度が第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);
}
私は「どちらも完全一致です」と言うのは正しいですか?理解できませんでした。 –
@ GilsonPJ必要な変換(配列からポインタへの変換と修飾)のランクは完全一致です。したがって、全体の変換シーケンスも完全一致です。 – user657267
@Gilson:基本的に、両方とも完全一致で同じランクを持っていますが、cv-qualificationに関する特別なルールはそれを上回り、#2の優先順位を与えます。要するに**それはちょうど**です。 –