C ++, как определяется неявное преобразование / конструктор? - PullRequest
2 голосов
/ 14 марта 2010

Как C ++ определяет неявное преобразование / построение объектов на нескольких уровнях? например:

struct A {};
struct B: A {};
struct C { operator B() { return B(); } };

void f(A a) {}

int main(void)
{
    f(C());
}

Создает ли дерево всех возможных преобразований и выбирает подходящий терминал? Что-то другое? Спасибо

Ответы [ 2 ]

4 голосов
/ 14 марта 2010

Для вызова f() потребуется два преобразования, одно преобразование, определенное пользователем (C в B) и одно встроенное преобразование (производное в основание: B в A). Вызовы с несовпадающими аргументами завершаются успешно, когда им требуется ноль или одно пользовательское преобразование. Если различные преобразования (встроенные или определяемые пользователем) будут успешными, то, если все возможные пути равны по количеству / виду необходимых преобразований, вызов неоднозначен, и компилятор должен выдать диагностику.

Как компиляторы реализуют это, стандартом не указано.

2 голосов
/ 14 марта 2010

Стандарт не указывает это. Это только указывает на результат. Каждый отдельный поставщик компилятора может реализовать это любым способом по своему выбору, если он дает правильный результат.

Так что, вероятно, существует целая куча разных подходов

...