【发布时间】:2015-03-13 12:25:24
【问题描述】:
根据我对 SO 和 cppreference link 的答案的阅读
继承的构造函数等价于用户定义的构造函数,其主体为空,成员初始化列表由单个 nested-name-specifier 组成,它将其所有参数转发给基类构造函数。
我得出的结论是,以下类 D 和 E 应该具有相同的行为。
#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 中所解释的,完美的转发习语不能替代继承构造函数。那么,身体究竟长什么样子呢?
【问题讨论】:
标签: c++ c++11 inheriting-constructors