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

下面的代码,是格式不良的NDR还是格式良好的?

程俊力
2023-03-14

Clang接受以下代码,但gcc拒绝它。

void h() { }

constexpr int f() {
    return 1;
    h();
}

int main() {
    constexpr int i = f();
}

以下是错误消息

g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'constexpr int f()':
main.cpp:5:6: error: call to non-'constexpr' function 'void h()'
     h();
     ~^~
main.cpp: In function 'int main()':
main.cpp:9:24: error: 'constexpr int f()' called in a constant expression
     constexpr int i = f();
                       ~^~
main.cpp:9:19: warning: unused variable 'i' [-Wunused-variable]
     constexpr int i = f();

共有1个答案

司空宣
2023-03-14

铿锵是正确的。对f()的调用是常量表达式,因为对h()的调用从不求值,因此[dcl.constexpr]/5不适用。对f()正文中的h()的调用格式并不错误,因为constexpr函数的约束没有说明不允许调用非constexpr函数。实际上,像下面这样的函数是格式良好的,因为当x为奇数时,对它的调用可以是常量表达式:

constexpr int g(int x) {
    if (x%2 == 0) h();
    return 0;
}
 类似资料:
  • 我的班级: 我的地图: 我的自定义类型“MyDateTimeType”将两列连接起来,并(在方法中)构建一个要在“Concurso”实例中配置的对象。 当我加载命名查询“find”并执行,生成的sql查询类似于: 问题在于“订单”条款。只有第二列接收“desc”字。正确答案应该是: 我能做些什么来解决这个问题?

  • 问题内容: 过去,我使用以下方法读取大量代码: 这样做是惯例吗? 优点和缺点是什么? 在我看来,这就像完成异常的“ Agent Orange”方式 编辑 处理方法中的预期异常 引发意外异常(一对一) 不在乎错误 那是路要走吗? 问题答案: 你不应该扔。这就是为什么。 Throwable是可抛出的事物层次结构的顶部,由and组成。由于根据定义是由不可挽救的条件引起的,因此将它们包括在方法声明中是没有

  • 目标 遵循类大小、方法大小和方法名称的最佳实践 了解重构的重要性 保持一致的编码风格和注释用法 使用内置记录功能 最佳编码实践 您现在已经学习了本学习路径的一半内容,已经掌握了足够多的 Java 语法来编写基本 Java 程序。在继续学习更高级的主题之前,目前是一个了解一些最佳编码实践的不错时机。阅读一些可帮助您编写更干净、更可维护的 Java 代码的必要建议。 保持类小巧 目前您已经创建了一些类

  • 我正在创建几个胸片片段以在其他页面中使用,我被告知它们需要在格式良好的html页面中(具有超文本标记语言、HEAD、BODY标记等)。是这样吗? 这些片段只会在其他地方与th: include/th:替换一起使用。

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我已经和我的一个朋友进行了很长的讨论,关于Java主方法的正确和正确使用。基本上我们有一个这样的类: 但是主要方法放在哪里?我认为“保留代码所属的位置”是一种好习惯,因此可以将上面的代码转换为 虽然我的伙伴认为“启动代码与应用程序本身