继承构造函数和花括号或等号初始化符

9
我不理解为什么不能编译一个类,它既有一个成员(无默认构造函数),又有一个带有花括号等于初始化器的继承构造函数。g ++会报错:

test.cpp:22:15:错误:使用已删除的函数“Derived :: Derived(float)”<br/> 派生d(1.2f);

test.cpp:16:13:注意:“Derived :: Derived(float)”被隐式删除
  因为默认定义将是不正确的:
  using Base :: Base; 

test.cpp:16:13:错误:没有找到匹配的函数来调用“NoDefCTor :: NoDefCTor()”<br/>   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);
}

代码可以编译,但从未使用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);
}

我不太喜欢在不需要默认构造函数时有一个默认构造函数。顺便说一下,在MSVC14上,这两个版本都可以编译(并且表现良好)。


2
这是GCC的一个bug吗?https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62310 - dyp
3
或者这是GCC的一个错误? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67054 - dyp
@dyp 谢谢。确实是第二个 bug。我以为那是语言的问题。 - maxbc
2
@dyp 那应该是一个答案。 - Shafik Yaghmour
继承构造函数很混乱。 - M.M
1个回答

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);
}                                        }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接