1 Где говорится о конструкторе скрытого копирования в базовом классе?
Он скрыт не так сильно, как неявный.
Использование n3290
:
§ 12 Специальные функции-члены
1 / Конструктор по умолчанию (12.1), конструктор копирования и оператор назначения копирования (12.8), конструктор перемещения и оператор присваивания перемещения (12.8) и деструктор (12.4) являются специальными функциями-членами.[Примечание: Реализация будет неявно объявлять эти функции-члены для некоторых типов классов, когда программа явно не объявляет их.Реализация будет неявно определять их, если они используются odr (3.2).См. 12.1, 12.4 и 12.8.- конец примечания]
Итак, давайте следуем за указателем:
§ 12.8 Копирование и перемещение объектов класса
7 / Если определение класса явно не объявляет конструктор копирования, он объявляется неявно.[...]
8 / Неявно объявленный конструктор копирования для класса X будет иметь вид
X::X(const X&)
if
- каждый прямой или виртуальный базовый класс B из X имеет конструктор копирования, первый параметр которого имеет тип const B&
или const volatile B&
и
- для всех не статических членов данных X, принадлежащих к классутип M (или его массив), каждый такой тип класса имеет конструктор копирования, первый параметр которого имеет тип const M&
или const volatile M&
.
В противном случае неявно объявленный конструктор копирования будет иметь вид
X::X(X&)
И вот он у вас.В вашем случае есть неявно заданный для вас конструктор копирования A::A(A const&)
.
2 Где говорится об этом поведении?
Неудивительно, что вчасть, посвященная обработке исключений.
§ 15.3 Обработка исключения
3 / Обработчик соответствует объекту исключениятипа E, если
[...]
- обработчик имеет тип cv T
или cv T&
, а T
является однозначным общедоступным базовым классом E
или
[...]
Это очень похоже на передачу параметров в функции.Поскольку B
публично наследует от A
, экземпляр B
может быть передан как A const&
.Поскольку конструктор копирования не является явным (гум ...), B
может быть преобразован в A
, и поэтому, как и для функций, можно передать B
там, где ожидается A
(без ссылки).
Стандарт продолжается:
4 / Обработчики для блока try пробуются в порядке появления.Это позволяет писать обработчики, которые никогда не могут быть выполнены, например, помещая обработчик для производного класса после обработчика для соответствующего базового класса.
Это действительно то, о чем действительно это предупреждение.