Начиная с C ++ 11, может быть два конструктора копирования, один из которых принимает параметр типа T&
, а другой - параметр const T&
.
У меня есть ситуация, когда (казалось бы) добавление второго конструктора копирования не приводит к вызову ни одного из них , когда конструкторы наследуются в производном классе. Конструктор копирования перекрывается шаблонизированным конструктором, когда оба присутствуют.
Вот MWE:
struct A {
template <typename... Args>
A (Args&&... args)
{ std::cout << "non-default ctor called\n"; }
A (A&) { std::cout << "copy ctor from non-const ref\n"; }
};
struct C :public A { using A::A; };
int main() {
C c1;
C c2(c1);
}
Запустив этот код, мы увидим вывод
non-default ctor called
copy ctor from non-const ref
, как и ожидалось.
Однако добавление дополнительного конструктора к struct A
выглядит следующим образом:
A (const A&) { }
каким-то образом заставляет другой конструктор копирования не вызываться, поэтому вывод становится
non-default ctor called
non-default ctor called
В моем случае я хочу наследовать все конструкторы из базового класса в производный класс, включая конструкторы копирования и все остальное. Но, похоже, что два конструктора копирования не наследуются, когда они оба присутствуют. Что здесь происходит?