double 类型的静态类成员的常量表达式初始值设定项

2024-05-12

在 C++11 和 C++14 中,为什么我需要constexpr在下面的代码片段中:

class Foo {
    static constexpr double X = 0.75;
};

而这会产生编译器错误:

class Foo {
    static const double X = 0.75;
};

并且(更令人惊讶的是)编译时没有错误?

class Foo {
    static const double X;
};

const double Foo::X = 0.75;

在C++03中,我们只允许为枚举类型的const整型的静态成员变量提供类内初始化器,在C++11中,我们可以使用constexpr在类中初始化文字类型的静态成员。 C++11 中对 const 变量保留了此限制,主要是为了与 C++03 兼容。我们可以从已关闭问题 1826:常量表达式中的 const 浮点 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1826其中说:

用常量初始化的 const 整数可以在常量表达式中使用,但用常量初始化的 const 浮点变量则不能。这是有意为之,以便与 C++03 兼容,同时鼓励一致使用 constexpr。然而,有些人发现这种区别令人惊讶。

CWG 最终关闭了该请求,因为该请求并非缺陷(NAD),基本上是说:

希望浮点值参与常量表达式的程序员应该使用 constexpr 而不是 const。

以供参考N1804与 C++03 最接近的标准草案可在 章节中公开获取9.4.2 [类.静态.数据] says:

如果静态数据成员是 const 整型或 const 枚举类型,则其在类定义中的声明可以 指定一个常量初始化器,它应该是一个整型常量表达式(5.19)。在这种情况下,该成员可以出现 在整型常量表达式中。如果在程序中使用该成员,并且该成员仍应在命名空间范围内定义,并且 命名空间范围定义不应包含初始值设定项。

以及 C++11 标准部分草案9.4.2 [类.静态.数据] says:

如果非易失性 const 静态数据成员是整型或枚举类型,则其在类中的声明 定义可以指定一个大括号或等于初始化器,其中每个初始化器子句都是赋值表达式 是一个常数表达式 (5.19)。可以在中声明文字类型的静态数据成员 使用 constexpr 说明符进行类定义;如果是这样,其声明应指定大括号或等于初始化程序 其中作为赋值表达式的每个初始值设定项子句都是常量表达式。 [...]

这与 C++14 标准草案中的内容几乎相同。

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

double 类型的静态类成员的常量表达式初始值设定项 的相关文章

随机推荐

  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将
  • 如何将动态数据传递给装饰器

    我正在尝试编写一个基本的 CRUD 控制器类来执行以下操作 下列的 class BaseCrudController model field validation template dir expose self template dir
  • 为什么 tty 在命令完成后挂起?

    我想运行这样的命令 kubectl run busybox it rm restart Never image busybox command sh c env 预计运行命令并删除 pod 它打印变量 但随后终端冻结 尽管 pod 处于完成
  • 在没有签名 URL 的情况下使用 CloudFront/S3 设置内容处置

    我有一些具有公共读取访问权限的对象 这些对象仅限于通过 CloudFront 提供服务 当我尝试传递一个response content disposition参数到我的 CloudFront URL 我收到 S3 错误 Request s
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • Pandas 数据框可对多列和要列出的值进行字典

    我有一个数据框 id key a1 1 a2 1 a3 1 a4 2 a5 2 a6 3 我想创建一本字典key作为机器号 并且id列作为列表 like 1 a1 a2 a3 2 a4 a5 3 a6 我可以先使用 groupby 然后再使
  • Paramiko ValueError“p 的长度必须恰好为 1024、2048 或 3072 位”

    我正在尝试使用 Python 脚本连接 SFTP 由于 p 错误 我无法连接 import paramiko client paramiko SSHClient client load system host keys client con
  • OpenXML 距离、大小单位

    OpenXML 中用于指定尺寸或 X Y 坐标的测量单位是什么 推介会 将它们与像素匹配是否有意义 如果是的话 如何将它们转换为像素 GraphicFrame Transform new Transform new Offset X 165
  • Windows:列出并启动与扩展关联的应用程序

    如何确定与特定扩展名 例如 JPG 关联的应用程序 然后确定该应用程序的可执行文件所在的位置 以便可以通过调用 System Diagnostics Process Start 来启动它 我已经知道如何读取和写入注册表 注册表的布局使得以标
  • 如何安装 Miles J 的 cakephp 论坛插件?

    我很确定这是一个蛋糕 1 3 问题 该插件与 2 0 不兼容 我正在尝试为论坛安装 cakephp 的 Miles J 插件 可以在这里找到 http milesj me code cakephp forum http milesj me
  • 判断 Git 提交是否是合并/恢复提交

    我正在编写一个脚本 需要检查特定提交是否是合并 恢复提交 我想知道是否有 git 技巧 到目前为止我想到的 我绝对不想依赖这里的提交消息 是检查HASH 2看看我是否没有收到错误 是否有更好的方法 判断某个东西是否是合并很容易 这是不止一位
  • 如何在 getStaticPaths 内添加 params 值数组

    我有一个页面 其结构如下 read slug number 我想要得到slug每个对应的值number in the getStaticPaths这是代码 export async function getStaticPaths const
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 无法下载 Windows 版 Composer SSL:握手超时

    这是我尝试安装 Windows 版 Composer 时得到的结果 The https getcomposer org versions https getcomposer org versions 无法下载文件 SSL 握手超时 无法启用
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 如何获取 ios 日期数组中的所有星期日

    我只想要一个数组 它以 NSDate 的形式包含一年中的所有星期一 但速度很快 我在 Objective c 中使用以下代码 但不知道如何在 swift 中使用它 NSDate pickerDate NSDate date NSLog pi
  • 用于带有嵌套子图的图的 r 包? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用于图形 网络的 r 包 它可以处理嵌套子图 Graphviz 做到了这一点 但只提供可
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub