私はこの質問に対する簡単な解決策を書こうとしていました:ポインターへの配列の減衰とオーバーロードの解決
明らかにオリジナルでは、両方のオーバーロードの変換強度が等しい (完全一致) ため、非テンプレートが優先されます。実際、もう一方をテンプレートに変更すると、呼び出しがあいまいになります。
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++ は、これはまだあいまいであると言います。デフォルト引数のユーザー定義の変換がオーバーロードのランキングに影響しないのはなぜですか?