gpt4 book ai didi

c++ - 继承的构造函数的定义(主体)是什么样的?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:01 24 4
gpt4 key购买 nike

根据我对 SO 和 cppreference link 的回答的阅读

The inherited constructors are equivalent to user-defined constructors with an empty body and with a member initializer list consisting of a single nested-name-specifier, which forwards all of its arguments to the base class constructor.

我得出结论,下面的类 DE 应该表现相同。

#include <string>
#include <utility>
using namespace std;

class B
{
public:
B(string&& a) : a(move(a))
{
}

string a;
};

class D : public B
{
public:
using B::B;
};

class E : public B
{
public:
E(string&& a) : B(a)
{
}
};

string foo()
{
return "bar";
}

int main()
{
D d = foo();//This compiles
E e = foo();//This does not compile
return 0;
}

E e = foo() 正确地无法编译,因为 B 的构造函数只接受 string&&。但是,D d = foo() 运行良好。这是为什么?使用的编译器是clang3.5。

编辑:此外,如本 answer 中所述, 完美的转发习语不能替代继承构造函数。那么, body 到底是什么样子的?

最佳答案

However, D d = foo() goes through fine. Why is that?

因为 using B::B 有效地将临时字符串直接传递给 B 的构造函数,在那里它仍然可以被 && 绑定(bind)(即它的 value category 仍然是 xvalue),然后进行任何额外的派生类初始化(如果有其他数据成员,VDT 等)。这是非常可取的,因为使用基类构造函数的目的是允许相同的客户端使用。

(这与 E(string&&) 形成对比,在其中,命名的 a 参数不再被视为传递给 的 xvalue(即将过期的临时值) B::B.)

(如果您还没有,您可能还想看看 (std::forward)[ http://en.cppreference.com/w/cpp/utility/forward]...它有助于完美转发参数)

关于c++ - 继承的构造函数的定义(主体)是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27957866/

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