gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:55:07 30 4
gpt4 key购买 nike

我读了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) 从 X 构建 B;

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

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

此模板化构造函数将允许从 A 构建 B。

我想知道这个方法有什么副作用,它有效定义了哪些构造函数?

例如,我可以这样将 A 移动到 B 吗?我还需要 B 中的 using A::A 声明吗?我需要添加一些 std::forward 黑魔法吗?

最佳答案

what are the side effects of this method and what constructors does it effectively defines ?

它只定义了一个模板c'tor。它的特化将尝试用你给它的任何初始化A

For instance, can I move an A to a B this way.

您没有转发。由于您按值传递,即使是显式 B b{std::move(a)}; 也不会将参数移动到 A 基数中。

Do I still need the using A::A declaration in B?

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

Do I need to add some std::forward black magic?

对于模板c'tor?确实。默认使用转发引用。自然 std::forward 来完成转发工作。

关于c++ - 从 C++ 中的基类继承复制/移动构造函数作为构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47326680/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com