Начиная с C++11, может быть два конструктора копирования, один из которых принимает параметр типа T&
, а другой — параметр типа const T&
.
У меня возникла ситуация, когда (по-видимому) добавление второго конструктора копирования не приводит к тому, что ни один из них не вызывается, когда конструкторы наследуются в производном классе. Конструктор копирования переопределяется шаблонным конструктором, если присутствуют оба.
Вот МВЕ:
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
В моем случае я хочу наследовать все конструкторы базового класса в производный класс, включая конструкторы копирования и все остальное. Но кажется, что каким-то образом два конструктора копирования не наследуются, когда они оба присутствуют. Что здесь происходит?
A (const A&) { }
я вижу только одну строку вывода: wandbox.org/permlink/ex8AyRHqF1ChsNcc (const Реф версия называется) - person jcai   schedule 05.07.2018A(A&)
иA(A const&)
- person M.M   schedule 05.07.2018= default;
был добавлен в C ++ 11. У вас все еще могут быть два пользовательских конструктора копирования в C++03. На самом деле в разделе 12.8/2 стандарта С++ 03 есть пример именно этого. - person M.M   schedule 05.07.2018