【问题标题】:Implicitly deleted default constructor works in C++14隐式删除的默认构造函数在 C++14 中有效
【发布时间】:2017-09-10 15:18:13
【问题描述】:

我正在对一些没有编译的代码做一些测试,我发现这段代码:

struct A {
    A(int) {};
    virtual void foo() = 0;
};

struct B : public virtual A {
    virtual void bar() = 0;
};

struct C : public B {
    C() : A(1) {}
    virtual void foo() override {}
    virtual void bar() override {}
};

int main() {
    C c;
    return 0;
}

在 C++11 中使用 ‘B::B()’ is implicitly deleted because the default definition would be ill-formed 编译失败(在 g++ 7.0.1 上),而在 C++14 中编译成功。

我试图找出 C++14 的哪个新特性允许它工作,但无济于事。 cppreference 中的description 并没有提到任何看起来像的东西。

为什么这段代码可以在 C++14 中编译,而在 C++11 中不能编译?

【问题讨论】:

  • 在 Clang 中以 C++11(和 C++03)模式工作。那么可能是 GCC 中的一个错误?
  • @JosephThomson 我想到了这一点 - 诚然我没有在 Clang 中测试它,我的错。实际上它也适用于 C++03 模式下的g++。所以也许我应该打开一个错误报告..
  • 取决于是否有人可以回答您的问题!
  • 这是core issue 1658

标签: c++ c++11 c++14 default-constructor


【解决方案1】:

这绝对是 gcc 7 中的一个错误,因为当我在使用 gcc 7+ 的在线编译器中检查您的代码时,它运行良好,没有任何问题。

所以我在这里为您提供在线 IDE,您可以在其中设置自己喜欢的编译器并尝试进行测试,如果您愿意的话。

https://godbolt.org/

抱歉,我无法为您提供更好的帮助,但我无法重现您的错误。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2019-05-07
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多