Я хочу унаследовать конструктор копирования базового класса, используя ключевое слово using
:
#include <iostream>
struct A
{
A() = default;
A(const A &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
A( A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
A& operator=(const A &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
A& operator=( A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
};
struct B : A
{
using A::A;
using A::operator=;
B& operator=(const B &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
B& operator=( B &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
};
int main()
{
A a;
B b;
b = a; // OK
B b1( a ); // compile error
B b2(std::move(a)); // compile error
return 0;
}
Наследование оператора присваивания с использованием ключевого слова using
работает нормально, но наследование конструкторов копирования и перемещения вызывает ошибку компиляции: унаследованный конструктор не является кандидатом на инициализацию из выражения того же или производного типа.
http://coliru.stacked-crooked.com/a/fe84b429c391c894:
main.cpp:16:14: note: an inherited constructor is not a candidate for initialization from an expression of the same or derived type
main.cpp:8:5: note: candidate: A::A(A&&)
A( A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
^
main.cpp:16:14: note: inherited here
using A::A;
Почему я могу наследовать оператор присваивания, но не могу наследовать конструктор копирования? Какая разница? Я мог бы понять, если бы я тоже не мог наследовать операторы присваивания. Но наследование операторов присваивания, наоборот, считается нормальным. Для меня это немного странно.
История
То, что я хочу, похоже на то, что задается в этом вопросе: я хочу просто добавить новые методы в существующий класс, не изменяя его (это класс из другой библиотеки).
http://coliru.stacked-crooked.com/a/149a6194717cd465:
#include <iostream>
struct A // not my class
{
};
struct B : A
{
using A::A;
using A::operator=;
void foo() { std::cerr << "fuu" << std::endl; }
};
A NotMyFunc()
{
return {};
}
int main()
{
B b(NotMyFunc());
b.foo();
return 0;
}
Но я не хочу повторно реализовывать конструкторы копирования и перемещения.
using A::operator=;
все еще работает? - person anton_rh   schedule 01.03.2018A::A(const B&)
, но не для этого случая. Правильное обоснование находится здесь. Обратите внимание, что это относится только к конструкторам, а не к операторам присваивания. - person n. 1.8e9-where's-my-share m.   schedule 01.03.2018