引数の一致
オーバーロードされた関数は関数呼び出しの引数に現在のスコープ内の関数宣言の最も一致するように選択します。適切な関数の場合その関数が呼び出されます。」このコンテキストに適した次のいずれかを示しています :
厳密な一致が検索します。
単純変換が発生しました。
の整数の上位変換が発生しました。
目的の引数の型への標準変換です。
目的の引数の型にユーザー定義変換 (変換演算子またはコンストラクターがあります。
省略記号で表される引数が見つかりませんでした。
コンパイラは各引数の候補関数を作成します。候補関数はその場所の実引数が仮引数の型に変換できる関数です。
一連の最も一致する 「関数」は各引数の場合は選択した関数からすべてのセットの積集合です。交差部分が複数の関数が含まれている場合はオーバーロードがあいまいでエラーが発生します。最終的に選択された関数が 1 文字以上のグループの他のすべての関数より適合常にです。(完勝者がない場合はこのケースでない場合関数はエラーを生成します。
次の宣言について考えます (関数は次の説明に識別できるようにマークされた Variant 1Variant 2 とVariant 3):
Fraction &Add( Fraction &f, long l ); // Variant 1
Fraction &Add( long l, Fraction &f ); // Variant 2
Fraction &Add( Fraction &f, Fraction &f ); // Variant 3
Fraction F1, F2;
次のステートメントを検討します :
F1 = Add( F2, 23 );
このステートメントは設定のビルド : 2
セット 1: 型の端数の最上位最初の引数を持つ候補関数 |
セット 2: int を入力する場合は2 番目の引数に変換できる候補関数 |
---|---|
バリアント 1 |
インバリアント (1int は標準変換を使用して long に変換可能) |
バリアント 3 |
|
セット 2 の関数は実際のパラメーターの型から仮パラメーターの型への暗黙の型変換 (関数は仮パラメーターの型への実際のパラメーター型を変換する 「コスト」が最も小さい関数は関数です。
この二つのセットの積集合は1. です。あいまいな関数呼び出しの例を次に示します。:
F1 = Add( 3, 6 );
前の関数呼び出しでは次の設定をビルド :
セット 1: int 型の最初の引数を持つ候補関数 |
セット 2: int 型の 2 番目の引数を持つ候補関数 |
---|---|
インバリアント (2int は標準変換を使用して long に変換可能) |
インバリアント (1int は標準変換を使用して long に変換可能) |
これらの設定の交差部分が空であることに注意してください。したがってコンパイラがエラー メッセージを生成します。
n の 既定の関数は引数と引数の数と一致する引数に n+1 が 関数を区切ると各処理されます。
省略記号 (...) はワイルドカードとして動作します ; また実引数と一致します。これによりあいまいな設定で十分注意のオーバーロードされた関数のセットをデザインする原因となる場合があります。
[!メモ]
オーバーロードされた関数の型は関数呼び出しが出現するまで決定する必要があります。その場合は関数呼び出しの引数の場合は明確なオーバーロードを持つかどうかを確認できます。これにより特定の関数の呼び出しによって生成されるまで換あいまいさがコードに常駐できることを意味します。