Копировать конструктор с параметром в качестве ссылки на производный класс

Существует следующее определение конструктора копирования:

Конструктор без шаблона для класса X является конструктором копирования, если его первый параметр имеет тип X&, const X&, volatile X& или const volatile X&, и либо нет других параметров, либо все остальные параметры имеют аргументы по умолчанию (8.3.6).

Обратите внимание, что определение не связано с convertions, но следующая программа работает нормально:

#include <iostream>

struct B{ };

struct A : B
{
 A(){ }
 A(const B&){ }
};

B b;
A a = b;


int main(){ }
</iostream>

DEMO

и он производит выход

B()
B()
A(const B&)

Мне не ясно, я ожидал, что программа не напечатает A(const B&), потому что по определению A(const B&) не является конструктором копирования, поэтому он определенно определяется как A::A(const A&) с по умолчанию, который не вызывает побочных эффектов.

Не могли бы вы объяснить, что случилось с этой причиной?

2 ответа

Это называется конструктором преобразования (§12.3.1). b инициализируется копирование в a и A::A(const B&) выбрано для выполнения преобразования. Результат преобразования используется для прямой инициализации a.


A a = b;

Это вызовет конструктор преобразования класса A.

A(const B&){ } << This is conversion constructor for class A which defines conversion from B to A

Так же, как мы заявляем

A(int i) {} << Convert int to class A object.

Даже если вы удалите взаимосвязь между классами A и B, тогда также это приведет к вызову конструктора.

licensed under cc by-sa 3.0 with attribution.