Inheritance 即使使用“using”,构造函数也不会被继承`

Inheritance 即使使用“using”,构造函数也不会被继承`,inheritance,c++11,Inheritance,C++11,我想知道为什么下面的代码不能编译。这只是一个展示的例子,我不是在争论标准容器等的继承问题 class A : public std::array<int,3> { public: using std::array<int,3>::array; // define other methods (no data members) }; int main(int argc, char **argv) { A a ({1,2,3});

我想知道为什么下面的代码不能编译。这只是一个展示的例子,我不是在争论标准容器等的继承问题

class A : public std::array<int,3>
{
public:
    using std::array<int,3>::array;

    // define other methods (no data members)
};

int main(int argc, char **argv) {        
    A a ({1,2,3});      
    return 0;
}
编译很好,但是我需要添加一些自制的操作符来满足我的目的


感谢您的帮助。

std::array
除了自动构造函数之外,没有其他构造函数将其保留为聚合,拥有基类是对聚合初始化规则的拒绝,如下所述:

您提供给构造函数的大括号列表被视为一个参数。编译器正在查找具有一个a类参数的构造函数。此参数必须能够接受包含3个整数的大括号列表才能使用。由于A类没有这样的构造函数,编译器会发出一个错误。

std::array
没有构造函数;这是一个集合。试图继承他们可能是个坏主意。试图继承std::array可能是个坏主意。构造函数不是继承的,它们不能被继承。它更像是一个具有这种语法的委托。@Sebastian:哎哟,我的错。我忘了那个。而且,是的,继承std::array是不好的。那我就下地狱;)@luk32:我知道,我只是希望编译器像在其他情况下一样为我完成这项工作。但是我想Sebastian的评论解释了很多…@luk32 c++11允许构造函数继承,即使在这里它不是一个解决方案:显然是的,但事实是我试图继承聚合机制,这是不可能的。无论如何,谢谢你的回答。在任何情况下,在你展示的代码中,都会搜索一个带1个参数的构造函数。即使它是一个完全合法的聚合,您使用的语法也会搜索带有一个参数的构造函数,而不会执行聚合初始化。正确的语法应该不带括号(带或不带等号)。好吧,两者都适用于
std::array
,所以我希望(ed)在这里也适用,仅此而已。
using A = std::array<int,3>

int main(int argc, char **argv) {        
    A a ({1,2,3});      
    return 0;
}