3

私はこの質問に対する簡単な解決策を書こうとしていました:ポインターへの配列の減衰とオーバーロードの解決

明らかにオリジナルでは、両方のオーバーロードの変換強度が等しい (完全一致) ため、非テンプレートが優先されます。実際、もう一方をテンプレートに変更すると、呼び出しがあいまいになります。

struct stg
{
    template<typename T = void>
    stg(const char* const& c_str, T* = 0);

    template<int N>
    stg(const char (&str) [N]);
};

そこで、ユーザー定義の変換を導入したいと考えました。これは、2 番目のオーバーロードの正確な一致よりも厳密に悪いものです。

struct stg
{
    template<typename> struct cvt { operator int() { return 0;} };

    template<typename T = void>
    stg(const char* const& c_str, int = cvt<T>());

    template<int N>
    stg(const char (&str) [N]);
};

しかし、g++ は、これはまだあいまいであると言います。デフォルト引数のユーザー定義の変換がオーバーロードのランキングに影響しないのはなぜですか?

4

1 に答える 1