使用 "using" 关键字继承基类的复制和移动构造函数

Inheriting copy and move constructors of base class using "using" keyword

本文关键字:复制 构造函数 移动 基类 using 关键字 继承 使用      更新时间:2023-10-16

我想使用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;
}

但我不想重新实现复制和移动构造函数。

你需要一个以 A 作为参数的 B 构造函数。然后,您需要显式设置默认构造函数。

struct B : A
{
using A::A;
using A::operator=;
B() = default;
B(const A& a) : A(a) {}
B(A &&a): A(std::move(a)) {}
};