関数の呼び出しがあいまいですが、なぜですか?

Dec 12 2020
#include <iostream>
using namespace std;

void x(int a,int b){
  cout<<"int int"<<endl;
}
void x(char a,char b){
  cout<<"char char"<<endl;
}

int main() {
  int a =2;char c ='a';
  x(a,c);
  return 0; 
}

'x'の呼び出しは、Apple Clangコンパイラではあいまいです。なぜですか?

x(int、int)の場合、最初の引数は直接一致であり、2番目はx(char、char)の昇格です。最初の引数は、私が知っているように、またこの回答によると、標準の変換です-> https://stackoverflow.com/a/28184631/13023201

また、標準変換よりもプロモーションを優先する必要があります。次に、x(int、int)を呼び出す必要があります。では、なぜこれが曖昧なのですか?

回答

8 NathanPierson Dec 12 2020 at 15:51

cppreferenceが過負荷解決プロセスをどのように説明しているかを見てみましょう。

最高の実行可能な機能

実行可能な関数F1とF2の各ペアについて、i-番目の引数からi-番目のパラメーターへの暗黙的な変換シーケンスがランク付けされ、どちらが優れているかが判別されます(最初の引数を除いて、静的メンバー関数の暗黙的なオブジェクト引数はランキング)

F1のすべての引数の陰的変換がF2のすべての引数の陰的変換よりも悪くない場合、F1はF2よりも優れた関数であると判断されます。

..。

x(int, int)toは完全一致であり、toは変換であるx(char, char)ため、は最初の引数よりも適切に一致します。ただし、2番目の引数は完全一致ではなくプロモーションであるため、一致が悪くなります。したがって、どちらの関数も他の関数よりも一致しておらず、過負荷を解決することはできません。intintintcharx(int, int)