constexpr 与 const 对比 constexpr const

2023-12-13

变量上的 const 与 constexpr

这家伙关于 constexpr 的说法是正确的if double被使用(或float当然)。但是,如果您将 var 类型更改为double对于像 int、char 等整数类型,一切正常。为什么会发生这种情况?

http://ideone.com/DAWABE

int main() 
{
    const int PI1 = 3;
    constexpr int PI2 = 3;
    constexpr int PI3 = PI1;  // works
    static_assert(PI1 == 3, "");  // works

    const double PI1__ = 3.0;
    constexpr double PI2__ = 3.0;
    constexpr double PI3__ = PI1__;  // error
    static_assert(PI1__ == 3.0, "");  // error
    return 0;
}

Update: 下面这行是一个错误,我的意思是PI3__ = PI1__

constexpr double PI3__ = PI1;  // I meant PI1__

问题:

  1. Why const int = 3是编译时间常数,但是const double = 3.0不是?

  2. 我有什么理由应该使用constexpr const int val; over constexpr int val?他们俩似乎做的完全一样。


根据您在评论中的回答,这就是我的答案。 C++ 标准已经说得很清楚了。不过 GCC 5.1 在这里工作得很好:https://godbolt.org/g/2oV6Hk

T 类型的转换常量表达式是隐式转换为 T 类型的表达式,其中转换的 表达式是常量表达式,隐式转换序列仅包含 § 5.20 134 c ISO/IEC N4567

[...]

(4.6) — 积分促销 (4.5),

(4.7) — 除收缩转换 (8.5.4) 之外的积分转换 (4.7),

[...]

有关 n4567 中缩小转换 (8.5.4/7) 的参考:

缩小转换是隐式转换

  • 从浮点类型到整数类型,或者
  • 从 long double 到 double 或 float,或者从 double 到 float,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使无法精确表示),或者
  • 从整数类型或无作用域枚举类型到浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并且在转换回原始类型时将产生原始值,或者
  • 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,并且转换后的实际值将适合目标类型并在以下情况下产生原始值:转换回原始类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr 与 const 对比 constexpr const 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Mac 上的 Sublime Text 设置

    我正在从 Windows 切换到 Mac 但无法找到sublime settings文件被存储 有人可以指点我的路吗 如果你打开Sublime Text 2 gt Preferences gt Browse Packages the Pac
  • 在 Accordion 中一次打开一个选项卡

    我有一个工作得很好的手风琴 但我需要的是一次只打开一个选项卡 这意味着当打开一个选项卡时 应该关闭另一个选项卡 目前您可以看到我们可以通过单击选项卡链接来打开所有选项卡 代码在这里 accordion gt li gt span click
  • 为了防止性能问题,“滚动链接定位效果”的替代方案是什么?

    我在 Firefox 中收到以下警告 该网站似乎使用了滚动链接定位效果 这可能不适用于异步平移 看https developer mozilla org docs Mozilla Performance ScrollLinkedEffect
  • 复制到剪贴板的图像在 Linux 上不会保留

    我正在尝试将图像保存到系统剪贴板 所以我编写了一些如下代码 usr bin python3 from PyQt5 Qt import QApplication from PyQt5 QtWidgets import QWidget QPus
  • 当父进程被杀死时,使用 fork() 创建的子进程是否会自动被杀死?

    我正在创建子进程fork 在 C C 中 当父进程结束 或由于某种原因被杀死 时 我希望所有子进程也被杀死 这是系统自动完成的吗 还是我必须自己做 先前存在的类似问题 当父进程退出时 如何使子进程退出 如何让子进程在父进程退出后终止 不会
  • iPhone 模拟器在应用程序启动时崩溃

    升级到 Lion 和 XCode 4 1 后 我在使用 iPhone 模拟器时遇到了一些问题 当我启动 4 0 4 1 或 4 2 的模拟器 我从 Time Machine 恢复 时 我得到一个EXC BAD ACCESS几乎立即出现错误
  • 在Python中每n个项目分割一个生成器/迭代器(splitEvery)

    我正在尝试用 Python 编写 Haskell 函数 splitEvery 这是它的定义 splitEvery Int gt e gt e splitEvery n splits a list into length n pieces T
  • pygame精灵墙碰撞[重复]

    这个问题在这里已经有答案了 我正在用 python 和 pygame 开发一个平台游戏 完整代码可以在 https github com C Kimber FBLA Game 我遇到的问题是玩家精灵和墙壁精灵之间的碰撞 特别是角落 当玩家按
  • 术语查找机制可以通过id以外的其他字段查询吗?

    这里是elasticsearch官网关于术语的介绍 https www elastic co guide en elasticsearch reference 2 1 query dsl terms query html 正如我们所看到的
  • 使用 JavaScript 检查浏览器 CSS 属性支持?

    JavaScript 是否可以知道客户端浏览器是否支持 CSS 属性 我说的是CSS3的旋转属性 我只想在浏览器支持的情况下执行某些功能 我相信你可以这样做 if WebkitTransform in document body style
  • 如何手动验证模型的属性?

    我有一堂课叫User和一个财产Name public class User Required public string Name get set 我想验证它 如果有任何错误添加到控制器的ModelState或实例化另一个模型状态 Http
  • 通过互联网的 RMI iiop

    我正在尝试获取 OracleRMI IIOP 示例工作 但我在 Netbeans 中执行此操作时遇到问题 我的代码如下 界面 import java rmi Remote import java rmi RemoteException pu
  • 为什么在 while 循环之后我只获得最后一行值?

    这是我正在阅读的文件 Log1 Time Src id Des id Address 0 34 56 x9870 2 36 58 x9872 4 38 60 x9874 6 40 62 x9876 8 42 64 x9878 Log2 Ti
  • 如何将 FacesMessage 从支持 bean 附加到 ui:repeat 中的特定字段?

    我有一个具有可变数量输入元素的表单 如下所示
  • 创建文件后发生文件共享冲突?

    因此 我尝试创建一个 txt 文件 然后向其中写入一些愚蠢的数据 但我遇到了共享违规 我感觉这可能是因为我试图在创建文件后直接为其创建 StreamWriter 但这没有意义 所以我有点失落 我已经尝试删除类中除错误行之外的所有其他 Str
  • PHP 脚本不会在后台运行

    我正在尝试在后台运行 php CLI 脚本 但它无法运行 它的状态为 已停止 SIGTOU 尝试写入输出 以下是详细信息 Mac OS X Lion 10 7 2 PHP 5 3 6 与 Suhosin Patch cli 构建时间 201
  • 为什么我的 CodeIgniter 表单验证不起作用?

    我正在尝试在使用表单助手创建的简单联系表单上设置验证 根本不会发生任何验证 怎么了 在下面的代码中 无论在表单中输入什么内容 good 关键字始终显示 并且从不显示通过 set value 设置的保存值 控制器 Contact functi
  • CasperJS 不能要求下划线

    我在用着CasperJS运行自动化前端测试 但在我的测试中使用其他 npm 模块时遇到了问题 我知道patchRequire但是我相信这只能在测试环境之外调用 因为测试运行程序补丁会自动需要 我确实包含了它 但结果是一样的 它说找不到该模块
  • 更改 JavaScript Prompt() 显示的格式和文本?

    我正在使用 JavaScriptprompt 功能 var favorite prompt What is your favorite color RED 我使用的是 IE 7 打开的提示框有一个标题栏 上面写着 资源管理器用户提示 还有更
  • constexpr 与 const 对比 constexpr const

    变量上的 const 与 constexpr 这家伙关于 constexpr 的说法是正确的if double被使用 或float当然 但是 如果您将 var 类型更改为double对于像 int char 等整数类型 一切正常 为什么会发