继承构造函数和支撑或相等的初始值设定项

max*_*xbc 9 c++ constructor c++11 inherited-constructors

我不明白为什么你不能编译一个既有成员(不是默认可构造)又带有大括号或者相同的初始化器和继承的构造函数的类.g ++说:

test.cpp:22:15:错误:使用已删除的函数'Derived :: Derived(float)'
派生d(1.2f);

test.cpp:16:13:注意:'Derived :: Derived(float)'被隐式删除,
因为默认定义不正确:
使用Base :: Base;

test.cpp:16:13:错误:没有匹配函数调用'NoDefCTor :: NoDefCTor()'
test.cpp:5:1:注意:候选:
NoDefCTor :: NoDefCTor(int)NoDefCTor(int){}

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

struct NoDefCTor
{
    NoDefCTor(int) {}
};

struct Base
{
    Base(float) {}
};

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

int main()
{
    Derived d(1.2f);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

当我不需要默认构造函数时,我真的不喜欢这个想法.另外,两个版本在MSVC14上编译(并且表现得很好).

dyp*_*dyp 6

这是一个gcc bug,#67054.将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);
}                                        }
Run Code Online (Sandbox Code Playgroud)

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