8

私のコードは次のとおりです。

#include <cmath>
#include <iostream>

float foo(float f) {
    std::cout << "float\n";
    return f;
}
double foo(double d) {
    std::cout << "double\n";
    return d;
}

int main() {
    int i = 16;
//  foo(i); // ambiguous call, of course
    return (int) std::sqrt(i);
}

最後の行の呼び出しは、を使用してもあいまいであるとは報告され-pedantic -std=c++98 -Wall -Wextraませんが、同じ理由で他のコンパイラでは必ずしも機能しないためfoo(i)です。

gccは名前空間に以下を追加しますstd

template<typename _Tp>
    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                       double>::__type
    sqrt(_Tp __x)
    { return __builtin_sqrt(__x); }

つまり、inline double sqrt(X)すべての整数型Xを追加します。

g ++が私とすべてを助けるために最善を尽くしていることに感謝しますが、コードのバグを診断するための(正当な)方法はありますか?

[編集:私はgcc 4.3.4を使用していますが、他のバージョンのgccで診断できる場合は、その事実にも興味があります!]

4

2 に答える 2

2


[lib.global.functions] / 2によると、GCCによるこの「役立つ」標準ライブラリの追加はC++03では準拠していません。

[標準ライブラリの定義で説明されている]グローバル関数シグニチャの呼び出しは、実装が追加のグローバル関数シグニチャを宣言していない場合と同じように動作します。

つまり、実装(gcc)は、プログラムの観察可能な動作に影響を与える限り、(役立つかどうかにかかわらず)余分なオーバーロードを追加することは許可されていません。

于 2011-05-19T09:48:18.373 に答える
2

FDISからの見積もりが必要ですか?

26.8の最後の段落:

さらに、以下を保証するのに十分な追加の過負荷が存在するものとします。

  1. パラメータに対応する引数のdoubleタイプが。の場合、パラメータにlong double対応するすべての引数doubleは事実上にキャストされlong doubleます。

  2. それ以外の場合、doubleパラメーターに対応する引数のいずれかが型doubleまたは整数型である場合、パラメーターに対応するすべての引数doubleは事実上にキャストされdoubleます。

  3. それ以外の場合、パラメータに対応するすべての引数doubleは効果的ににキャストされfloatます。

この場合、適用されるのはポイント2である必要があります。

于 2011-05-19T09:31:40.400 に答える