大佬教程收集整理的这篇文章主要介绍了c – 多拷贝构造函数继承中的令人惊讶的行为,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,即(似乎)添加第二个复制构造函数会导致在构造函数在派生类中继承时不会调用任何一个.当两者都存在时,复制构造函数被模板化构造函数覆盖.
这是一个MWE:
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
这是预期的.
A (const A&) { }
non-default ctor called non-default ctor called
在我的用例中,我想将所有构造函数从基类继承到派生类,包括复制构造函数和其他任何东西.但似乎不知何故,当两个拷贝构造函数都存在时,它们不会被继承.这里发生了什么?
所以
struct C :public A { using A::A; };
是
struct C :public A { using A::A; C(const C&) = default; C(C&&) = default; };
其中C(const C&)=默认值;类似于
C(const C& c) : A(static_cast<const A&>(c)) {}
所以
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 A { template <typename... Args> A (Args&&... args) { std::cout << "non-default ctor called\n"; } A (const A&) { std::cout << "copy ctor from const ref\n"; } A (A&) { std::cout << "copy ctor from non-const ref\n"; } };
选择A(const A&).
您可以注意到,还有一个缺陷:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0136r1.html
有了这个缺点,你的C级就是
struct C :public A { using A::A; template <typename ...Ts> C(Ts&&... ts) : A(std::forward<Ts>(ts)...) {} // Inherited. C(const C&) = default; C(C&&) = default; };
所以你调用C(C& c):A(c){}(在模板替换之后).
以上是大佬教程为你收集整理的c – 多拷贝构造函数继承中的令人惊讶的行为全部内容,希望文章能够帮你解决c – 多拷贝构造函数继承中的令人惊讶的行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。