我阅读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?
答案 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
自然地完成了转发工作。