当前位置: 首页 > 知识库问答 >
问题:

constexpr C错误:在其定义之前使用析构函数

史良哲
2023-03-14

我在使用g-12时遇到了一个错误,它在clang-13中没有出现。特别是,这段代码:

struct A {
    constexpr virtual ~A() = default;
    constexpr A() = default;
};

struct B : public A {
    constexpr ~B() = default;
    constexpr B() = default;
};

constexpr int demo(){
    B *b = new B();
    delete b;
    return 2;
}

int main(){
    constexpr int demod = demo();
    return demod;
}

使用clang编译,但使用g会产生错误:

minimize-error.cpp: In function ‘int main()’:
minimize-error.cpp:18:31:   in ‘constexpr’ expansion of ‘demo()’
minimize-error.cpp:13:12: error: ‘virtual constexpr B::~B()’ used before its definition
   13 |     delete b;
      |

奇怪的是,如果我删除了对解调器的constexpr要求,那么这个例子编译和运行时就不会出错。

你知道这里发生了什么吗?

共有2个答案

訾朗
2023-03-14

正如StoryTeller在评论中指出的,这是错误93413的一个实例。重复的错误104653建议了一种解决方法:

struct A{
    constexpr virtual ~A() = default;
    constexpr A() = default;
};

struct B : public A {
    virtual constexpr ~B() override;
    constexpr B() = default;
};

constexpr B::~B() = default;

consteval int demo(){
    B *b = new B();
    delete b;
    return 2;
}

int main(){
    return demo();
}
东深
2023-03-14

这是一个GCC错误,请参阅此报告。

在当前GCC的常量求值中,虚拟默认析构函数似乎根本不起作用。正如bug报告中所提到的,简单地说

struct A{
    constexpr virtual ~A() = default;
};

constexpr A a;

也失败了。

作为一种解决方法,您可以手动提供析构函数的定义,而不是默认:

constexpr virtual ~A() {}

/*...*/

constexpr ~B() {}

然后GCC似乎很高兴。

 类似资料:
  • 问题内容: 我正在尝试通过以下代码通过asp.net ajax调用Web服务 这是我正在渲染的aspx页面 这是我正在呼叫的网络服务 页面呈现得很好,但是每当我更改列表项的值时,它就会显示JavaScript运行时错误:’HRService’未定义。为什么是这样。 抱歉这么长的帖子.... 问题答案: 您可以尝试,只需添加和 在aspx中,像这样修改您的scriptManager 然后您可以通过这

  • 我有一个问题,关于如何通过Java内存模型保证对象是线程安全的。 我读过很多书,说在构造函数中编写同步作用域没有意义,但为什么没有呢?是的,只要构造中的对象不在线程之间共享(不应该共享),除了构造线程之外,没有其他线程可以访问任何同步的(this{…}),因此,无需在构造函数中设置该范围来排除它们。但同步作用域不仅仅是为了排除;它们还用于创建发生在关系之前的事件。JLS。17.4 这是一个示例代码

  • 我已经开始为一个简单的应用程序开发后端,并且我已经建立了一个数据库类(名为),所有文件都将与之通信。在我的中,我有以下内容: 它是一个,所以我可以从其他文件中访问。 在我的其他文件中,我有以下帮助可读性:(因为它是一个类,它将通过引用传递) 在我的课程中: 当我构建代码时,它构建得很好。 运行时,应用程序立即崩溃与。错误消息是: 我已尝试在类中的init函数上放置断点。它没有到达断点。 我已尝试将

  • 有人能告诉我,当我尝试将旧的sql切换到SQLI时,为什么这不起作用吗: 致: 它一直给我一个错误:“致命错误:调用未定义的函数mysqli_result()”

  • 问题内容: 当我想在浏览器上运行phpMyAdmin时,向我显示此错误: 我在PHP 5.5.7中使用fedora 17。 有解决问题的主意吗? 问题答案: 检查您的会话目录是否可被Web服务器进程写入。 最好的方法是创建自己的phpinfo文件。在任何可通过网络访问的文件夹中,创建一个包含以下内容的文件(您可以将其命名为test.php或phpinfo.php或其他名称): 在浏览器(或类似浏览

  • 问题内容: 即使在不同的浏览器中,此代码也始终有效: 但是,我找不到关于为什么它应该起作用的单一参考。我首先在John Resig的演示文稿中看到了这一点,但仅被提及。那里或任何地方都没有解释。 有人可以启发我吗? 问题答案: 该声明是魔术,使它的标识符在代码块*中的任何内容执行之前就被绑定了。 这与带有表达式的赋值不同,后者以正常的自上而下的顺序求值。 如果将示例更改为说: 它将停止工作。 函数