C ++ primer 5-е изд. взаимные преобразования - PullRequest
1 голос
/ 06 мая 2020

Мне трудно понять взаимные преобразования, это объясняется в C ++ Primer 5 ed.:

«В следующем примере мы определили два способа получения A из B : либо с помощью оператора преобразования B, либо с помощью конструктора A, который принимает B: // обычно плохая идея для взаимных преобразований между двумя типами классов:

struct B;
struct A {
A() = default;
A(const B&);        // converts a B to an A
// other members
};

struct B {
    operator A() const; // also converts a B to an A
    // other members
};

A f(const A&);
B b;
A a = f(b); // error ambiguous: f(B::operator A())
        //          or f(A::A(const B&))

Потому что есть два пути чтобы получить A из B, компилятор не знает, какое преобразование выполнить; вызов f неоднозначен. Этот вызов может использовать конструктор A, который принимает B, или он может использовать оператор преобразования B, который преобразует B на A. Поскольку эти две функции одинаково хороши, вызов является ошибочным.

Если мы хотим сделать этот вызов, мы должны явно вызвать оператор преобразования или конструктор:

A a1 = f(b.operator A()); // ok: use B's conversion operator 
A a2 = f(A(b));           // ok: use A's constructor

Обратите внимание, что мы не можем разрешить неоднозначность, используя приведение - само приведение будет иметь такую ​​же неоднозначность ».

  • Но когда я определил требуемые члены и * 1 016 * Я не получаю ошибок! его объяснение выглядит настолько логичным, но я не знаю, почему код работает нормально?!

1 Ответ

5 голосов
/ 06 мая 2020

Но когда я определил требуемые члены и f, я не получил никакой ошибки!

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

Я использую G CC.

Вы можете попросить G CC попытаться соответствовать стандарту C ++, используя параметр -pedantic. К сожалению, в противном случае по умолчанию будут включены некоторые языковые расширения.

...