コードがある場合:
int f(int a) { return a; }
double f(double g) { return g; }
int main()
{
int which = f(1.0f);
}
fのどのオーバーロードが呼び出され、その理由は?
戻り値の型はオーバーロードの目的ではまったく考慮されないため、double バージョンが得られます。
このようになっている理由を理解するには、次の呼び出しを検討してください。
int bar = f(g(h(foo)));
過負荷の解決には引数のみが含まれるため、h、g、最後にfを個別に推測できます。戻り値が関係している場合は、それらを同時に推測する必要があります。それぞれに10個のオーバーロードがある場合、最初のケースでは30個の可能なオーバーロードをチェックし、2番目のケースでは1000個の可能な組み合わせをチェックしています。そして、そのようなネストされたコードがまれだと思う場合は、検討してください
std::cout << "int i = " << i << std::endl;