为什么我可以在 constexpr 函数内调用非 constexpr 函数?

2024-01-30

考虑以下代码:

#include <stdio.h>

constexpr int f()
{
    return printf("a side effect!\n");
}

int main()
{
    char a[f()];
    printf("%zd\n", sizeof a);
}

我本以为编译器会抱怨调用printf inside f, 因为f应该是constexpr, but printf不是。为什么程序编译并打印15 https://ideone.com/QNL5u8?


该计划是不规范的并且不需要根据以下诊断C++11 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf部分7.1.5 constexpr 说明符段落5其中说:

对于 constexpr 函数,如果不存在这样的函数参数值 函数调用替换会产生一个常量 表达式(5.19),程序格式错误;无需诊断。

并提供以下示例:

constexpr int f(bool b)
  { return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required

和部分5.19段落2 says:

条件表达式是核心常量表达式,除非它 涉及以下内容之一作为潜在评估的子表达式 [...]

包括:

— 调用除 constexpr 构造函数之外的函数 文字类或 constexpr 函数 [注意:重载解析 (13.3)照常应用——尾注];

在这种情况下,我们可能更喜欢进行诊断,这可能只是一个疏忽,我有一个类似情况的错误报告,其中gcc不会产生错误,但我们可能希望它:编译器在常量表达式中认为未定义的行为是否允许有余地? https://stackoverflow.com/questions/21502017/is-the-compiler-allowed-leeway-in-what-it-considers-undefined-behavior-in-a-cons.

Update

使用-fno-builtin标志将导致gcc产生以下错误:

 error: call to non-constexpr function 'int printf(const char*, ...)'
 return printf("a side effect!\n");
                                 ^

So gcc确实考虑到这一点不规范的当它使用内置版本时它只是忽略它printf.

虽然使用起来有些不一致-pedantic产生以下警告:

warning: ISO C++ forbids variable length array 'a' [-Wvla]
 char a[f()];
           ^

请注意,使用f()初始化一个常量表达式多变的:

constexpr int x = f() ;

确实会产生错误:

error: 'printf(((const char*)"a side effect!\012"))' is not a constant expression

请注意,另外在更一般的情况下,不允许编译器将标准库函数标记为常量表达式 除非标准明确允许 https://stackoverflow.com/q/27744079/1708801.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我可以在 constexpr 函数内调用非 constexpr 函数? 的相关文章

  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 如何在建立上下文时设置连接超时-PrincipalContext

    using PrincipalContext ctx new PrincipalContext ContextType Domain Domain UserName Password UserPrincipal U new UserPrin
  • 以编程方式更新 Wifi 网络

    我正在尝试创建一个程序 当某个 wifi 网络在范围内时 该程序会连接到该网络 即使已经连接到另一个 wifi 也是如此 我在用着简单Wifi https github com DigiExam simplewifi 基本上效果很好 除了在
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 绑定集合的子集

    我有一个ObservableCollection
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 为什么使用 .AsEnumerable() 而不是转换为 IEnumerable

    扩展方法之一IEnumerable
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2

随机推荐

  • 在不使用索引的情况下替换 pandas DataFrame 中选定单元格的值

    这是一个非常相似的问题这个问题 https stackoverflow com questions 13842088 set value for particular cell in pandas dataframe但有一个关键的区别 我选
  • GitHub:如何将开放的拉取请求添加到本地存储库?

    我正在使用NSDate 扩展 https github com erica NSDate Extensions我的 iOS Xcode 项目中的插件 主存储库有一些错误 似乎在两个 Pull 请求中得到了修复 https github co
  • django TypeError:get() 获得关键字参数“invoice_id”的多个值

    我对 python 和 django 比较陌生 我有以下其余 api 视图 class InvoiceDownloadApiView RetrieveAPIView This API view will retrieve and send
  • 缺少rabbitMQ配置文件

    我正在使用 Rabbitmq 3 7 2 和 Erlang 20 2 并且 bydefualt RMQ 配置文件丢失 在以下路径 C Users vxadmin AppData Roaming RabbitMQ config 基于我采取的步
  • 在 Android 上添加的文件夹通过 USB 不可见

    我正在尝试将图片保存在 Android 上的子文件夹中 这是我的一些代码 File path Environment getExternalStoragePublicDirectory Environment DIRECTORY DCIM
  • R - 按列名 AS CHARACTER 对 data.frame 进行排序

    我知道我可以这样订购 data frame test data frame A c 4 2 4 B c 8 3 2 ordered test with test order A B 但是 当列由列名指定为字符变量时 如何完成同样的事情呢 这
  • Lua - 初始化[重复]

    这个问题在这里已经有答案了 我无法在 Arch Linux 下正确初始化 lua Lua 最新版本 这是我的代码 include
  • 为特定风格和 buildType 定义 buildconfigfield

    我有两种口味 比如说香草和巧克力 我还有 调试 和 发布 构建类型 并且我需要 Vanilla Release 的字段为 true 而其他 3 个组合应该为 false def BOOLEAN boolean def VARIABLE VA
  • 检测 window.location 的变化

    我正在尝试检测 window location 中的更改 例如 如果用户尝试重新加载页面 则会收到通知 但我似乎找不到方法来做到这一点 有一些与之相关的事件吗 Thanks The unload当用户离开页面时触发该事件 还有一个befor
  • 异步/同步 JavaScript

    我在理解异步和同步 Javascript 之间的区别时遇到了一些困难 希望有人能对此有所了解 我知道 Javascript 本质上是同步的 但您可以使用异步事件 回调来改变程序流程 但是 如果您调用包含 AJAX 且没有回调的函数 会发生什
  • 通过 url 将参数传递给 python azure 函数

    我试图通过 azure 函数使 hello world 示例适用于 python 基本函数尝试通过 url 检索输入的名称 然后响应 Hello Name 事实证明 通过天蓝色门户提供的示例模板不能开箱即用 基本示例如下所示 import
  • 在 SwiftUI 中根据宽度计算每行的项目数

    这是我之前问题的延伸 在 SwiftUI 中使用获取视图的宽度 https stackoverflow com questions 57577462 get width of a view using in swiftui 57591483
  • apache 到 tomcat:mod_jk 与 mod_proxy

    使用有什么优点和缺点mod jk and mod proxy用 apache 来处理 tomcat 实例 我多年来一直在生产中使用 mod jk 但我听说这是前端 tomcat 的 旧方法 我应该考虑改变吗 会有什么好处吗 这些模块的优缺点
  • 触摸屏平板电脑上的 WPF Scrollviewer

    我正在编写一个 WPF 应用程序 它将在完整的 Windows 8 触摸屏平板电脑 而不是 RT 上运行 但是触摸滚动似乎不起作用 所以我想知道我是否做错了什么或者是否有可能 所以 我有一个带有滚动查看器的 WPF 窗口 在该滚动查看器中
  • pandas 3x3 散点矩阵缺少标签

    我使用以下代码创建一个 pandas 散点矩阵 import numpy as np import pandas as pd a np random normal 1 3 100 b np random normal 3 1 100 c n
  • Jenkins 环境变量在构建后步骤中可用

    据我所知 Jenkins 在构建执行期间设置了某些环境变量 但我的问题是我可以在构建后脚本中访问这些变量吗 我进行了快速测试 但无法从构建后步骤 python 脚本访问 PROJECT NAME 和 BUILD URL 等 有没有办法可以从
  • 如何在linq中直接执行SQL查询

    在 C 和 VS 2008 中 我有一个查询 在这个查询中我连接了多个表 所以我不知道类型 我想知道如何在 linq 中直接运行 sql 查询 IEnumerable
  • tomcat中connectionTimeout的含义

    这个参数对于tomcat来说意味着什么 它被宣布于server xml如下
  • OpenCV K 均值 (kmeans2)

    我正在使用 Opencv 的 K means 实现来对一大组 8 维向量进行聚类 它们聚类得很好 但我找不到任何方法来查看聚类过程创建的原型 这可能吗 OpenCV 似乎只提供对集群索引 或标签 的访问 如果没有 我想是时候自己实现了 我不
  • 为什么我可以在 constexpr 函数内调用非 constexpr 函数?

    考虑以下代码 include