C++ 继承构造函数和大括号或相等的初始值设定项

C++ 继承构造函数和大括号或相等的初始值设定项,c++,c++11,constructor,inherited-constructors,C++,C++11,Constructor,Inherited Constructors,我不明白为什么不能编译一个既有带大括号或相等初始值设定项的成员(不是默认可构造的)又有继承构造函数的类。g++说: test.cpp:22:15:错误:使用已删除的函数“派生::派生(浮点)” 导出d(1.2f) test.cpp:16:13:注意:“派生::派生(浮点)”被隐式删除 因为默认定义的格式不正确: 使用Base::Base test.cpp:16:13:错误:没有匹配的函数用于调用“NoDefCTor::NoDefCTor()” 测试。cpp:5:1:注:候选人: NoDefCTo

我不明白为什么不能编译一个既有带大括号或相等初始值设定项的成员(不是默认可构造的)又有继承构造函数的类。g++说:

test.cpp:22:15:错误:使用已删除的函数“派生::派生(浮点)”
导出d(1.2f)

test.cpp:16:13:注意:“派生::派生(浮点)”被隐式删除
因为默认定义的格式不正确:
使用Base::Base

test.cpp:16:13:错误:没有匹配的函数用于调用“NoDefCTor::NoDefCTor()”
测试。cpp:5:1:注:候选人:
NoDefCTor::NoDefCTor(int)NoDefCTor(int){}

无法编译的代码(在g++5.1下):

编译的代码,但从不使用NoDefCTor的默认构造函数(尽管显然需要它!):

当我不需要一个默认构造函数时,我真的不喜欢这个想法。另一方面,这两个版本在MSVC14上的编译(和行为)都很好。

这是一个很好的例子。将alltaken380的错误报告与OP的案例进行比较:

// gcc bug report                        // OP
struct NonDefault                        struct NoDefCTor
{                                        {
    NonDefault(int) {}                       NoDefCTor(int) {}
};                                       };

struct Base                              struct Base
{                                        {
    Base(int) {}                             Base(float) {}
};                                       };

struct Derived : public Base             struct Derived : Base
{                                        {
    NonDefault foo = 4;                      NoDefCTor n2{ 4 };

    using Base::Base;                        using Base::Base;
};                                       };

auto test()                              int main()
{                                        {
    auto d = Derived{ 5 };                   Derived d(1.2f);
}                                        }

我们甚至可以在最近的GCC6.0版本上尝试,但它仍然无法编译。clang++3.6,根据OP,MSVC14接受这个程序。

这个gcc错误?还是这个gcc错误@谢谢。这确实是第二个错误。我认为这是语言问题。@dyp这应该是一个答案。继承构造函数是一团糟
struct NoDefCTor
{
    NoDefCTor(int) {}
    NoDefCTor() = default;
};

struct Base
{
    Base(float) {}
};

struct Derived : Base
{
    using Base::Base;
    NoDefCTor n2{ 4 };
};

int main()
{
    Derived d(1.2f);
}
// gcc bug report                        // OP
struct NonDefault                        struct NoDefCTor
{                                        {
    NonDefault(int) {}                       NoDefCTor(int) {}
};                                       };

struct Base                              struct Base
{                                        {
    Base(int) {}                             Base(float) {}
};                                       };

struct Derived : public Base             struct Derived : Base
{                                        {
    NonDefault foo = 4;                      NoDefCTor n2{ 4 };

    using Base::Base;                        using Base::Base;
};                                       };

auto test()                              int main()
{                                        {
    auto d = Derived{ 5 };                   Derived d(1.2f);
}                                        }