Разрешение перегрузки конструкторов для разных классов - PullRequest
9 голосов
/ 10 июня 2019

Рассмотрим этот код.

struct A {
    int i;
};

struct B {
    char c;
};

struct C {
    double d;
};

void f(A a);
void f(B b);
void f(C c);

void g()
{
    f({5});
}

Здесь я получаю двусмысленность в f({5});.Но кажется, что конструктор struct A является точным соответствием для {5}, в то время как второй нуждается в интегральном продвижении, в то время как последний нуждается в преобразовании с плавающей запятой.

Так почему же существуетнеоднозначность

Ответы [ 2 ]

7 голосов
/ 10 июня 2019

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

[over.ics.user]

1 Пользовательская последовательность преобразования состоит из начальной стандартной последовательности преобразования, за которой следует пользовательское преобразование ([class.conv]) с последующимвторой стандартной последовательностью преобразования.

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

Вызов функции неоднозначен из-за этого.

0 голосов
/ 10 июня 2019

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

Эта функция вызова g() может перейти к f(C c), а также f(A a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...