在C ++中从基类继承复制/移动构造函数作为构造函数

时间:2017-11-16 10:02:33

标签: c++ inheritance constructor

我阅读inheriting constructors问题,并且我广泛理解c ++构造函数继承。

class X;

class A {
    A(const A& a); // (1)
    A(const X& x); // (2)
};

class B : A {
    using A::A;
}

复制构造函数是特殊的,所以我不能使用(1)从A构建B虽然我可以使用(2)来构建一个B形式的X;

但是我可以在B中添加模板化构造函数:

template<class...T> B(T... t) : A(t...) {}

这个模板化的构造函数将允许构建一个B形式的A。

我想知道此方法的副作用是什么以及它有效定义了哪些构造函数?

例如,我可以用这种方式将A移动到B.我还需要B中的using A::A声明吗?我是否需要添加一些std :: forward black magic?

1 个答案:

答案 0 :(得分:1)

  

这种方法有哪些副作用,它有效地定义了哪些构造函数?

它只定义了一个模板c。它的专业化将尝试使用您提供的初始化A

  

例如,我可以用这种方式将A移动到B.

你没有转发。由于您通过值传递,即使明确的B b{std::move(a)};也不会将参数移动到A基础。

  

我还需要在B中使用A :: A声明吗?

你可能拥有它。它不会模棱两可,因为在进行重载解析时,非模板比模板更受青睐。继承的c将会在B b{std::move(a)};中使用(因为const引用可以绑定到xvalue)。从本质上讲,挑选的超载可能并不总是你想要的。

  

我是否需要添加一些std :: forward black magic?

对于模板c?#tor?当然。默认情况下使用转发引用。并且std::forward自然地完成了转发工作。