Преобразование аргументов по умолчанию не учитывается при выборе перегрузки?

Я пытался написать простое решение этого вопроса: распад массива на указатель и разрешение перегрузки

Очевидно, что в оригинале обе перегрузки имеют одинаковую степень преобразования (точное совпадение), поэтому предпочтение отдается не шаблону. Действительно, если я заменю другой на шаблон, вызов станет неоднозначным:

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

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

Поэтому я хотел представить пользовательское преобразование, которое было бы строго хуже, чем точное совпадение со второй перегрузкой.

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 ++ говорит, что это все еще неоднозначно. Почему пользовательское преобразование в аргументе по умолчанию не влияет на ранжирование перегрузки?

3

Решение

[over.match.viable] / 2 (из> n3797, github 5f7cb4)

Во-первых, чтобы быть жизнеспособной функцией, функция-кандидат должна иметь достаточно
параметры согласовать по количеству с аргументами в списке.

  • Если есть м аргументы в списке, все функции-кандидаты имеют
    именно так м параметры являются жизнеспособными.

  • Функция-кандидат, имеющая меньше
    чем м Параметры являются жизнеспособными, только если он имеет многоточие
    список параметров (8.3.5). В целях разрешения перегрузки любой
    аргумент, для которого нет соответствующего параметра, считается
    «соответствовать многоточию» (13.3.3.1.3).

  • Функция-кандидат, имеющая более м Параметры являются жизнеспособными, только если (М + 1)-St параметр имеет
    аргумент по умолчанию (8.3.6). В целях разрешения перегрузки список параметров обрезается справа, так что м параметры.

[акцент мой]
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector