现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)?

2023-12-26

以下代码在 c++14 中的 gcc 和 clang 下均无法编译,但在 c++1z 中编译成功:

struct Cls {
  static constexpr int N = 0;
};
constexpr int Cls::N;
constexpr int Cls::N;

C++14 错误是可以预测的:redefinition of ‘constexpr const int Cls::N’

是什么改变了这一点?我发现:

n4659 10.1.5 [dcl.constexpr]

使用 constexpr 声明的函数或静态数据成员 说明符隐式是内联函数或变量

所以我认为这可能与内联变量有关,但是对于两个编译器下的 c++1z 来说,以下内容都失败

struct Cls {
  static inline const int N = 0;
};
inline const int Cls::N; // note, only one definition here

在 C++17 之前,您需要重新声明所有static类外的变量恰好在一个翻译单元中(通常每个翻译单元是一个.cpp文件,反之亦然,但这不是必需的)。正如您所指出的,C++17 引入了inline类成员变量,以及static constexpr变量自动限定。你是not允许重新申报inline类外部的变量,正如您在第二个示例中看到的那样,但有一个例外constexpr因为以前您被允许(实际上是必需的)这样做,但语法已被弃用。

在 [class.static.data]p2 中,它允许非内联成员的语法(“在其类定义中非内联静态数据成员的声明不是定义,并且可以是 除 cv void 之外的不完整类型。未内联定义的静态数据成员的定义 类定义中的应出现在包含成员的类定义的命名空间范围中。”)

在下一段中,该标准允许constexpr类外声明并要求它们用于非constexpr数据(强调):

如果非易失性非内联const静态数据成员是整型或枚举类型,其声明 在类定义中可以指定大括号或等于初始化器在 其中每个初始化子句那是一个赋值表达式是一个 常数表达式 (8.20)。该成员仍应定义在 命名空间范围(如果在程序中使用了 odr(6.2))并且 命名空间范围定义不应包含初始化器。内联 静态数据成员可以在类定义中定义 并且可以指定一个大括号或等于初始化器. 如果该会员是 声明与constexpr说明符,它可以在中重新声明 没有初始化程序的命名空间范围(此用法已弃用;请参阅 D.1)。其他静态数据成员的声明不得指定大括号或等于初始化器.

这是弃用注释,D.1 静态 constexpr 数据成员的重新声明 [depr.static_constexpr]:

为了与之前的 C++ 国际标准兼容,constexpr 静态数据成员可以在外部多余地重新声明。 没有初始化程序的类。这种用法已被弃用。 [Example:

struct A {
  static constexpr int n = 5; // definition (declaration in C++ 2014)
};
constexpr int A::n; // redundant declaration (definition in C++ 2014)

—结束示例 ]

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

现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)? 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

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

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 什么是 __declspec 以及何时需要使用它?

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

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 匿名结构体作为返回类型

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

随机推荐

  • 哪一个更好地处理版本控制? XmlSerializer 与 DataContractSerializer?

    需要序列化一个对象 并且反序列化时程序集版本可能发生变化 此外 对象可能会发生一些变化 XmlSerializer 不存储类型信息 如果对象发生一点变化 它也不会失败 但 XmlSerializer 无法序列化超类中的私有或内部属性 我无法
  • JAX-RS 资源生命周期性能影响

    我知道默认情况下 JAX RS 端点生命周期是每个请求一次 以便可以将请求特定信息注入到实例中 而且我们还可以制作一个端点Singleton的意思每个应用程序一次 其中请求特定信息不能注入到实例中 而是可以注入到请求的方法中 1 所以我想知
  • Struts 2:将不同的 XML 验证文件应用于一个操作方法

    我是 Struts 2 Framework 的新手 我使用 XML 验证文件来验证表单的字段 我的问题是 如何将不同的 XML 验证文件应用于一个操作的方法 我还想对不止一种操作方法使用相同的 XML 验证文件 问 如何将不同的 XML 验
  • GetHashCode() 在不同的服务器上给出不同的结果?

    我像这样声明了 C 代码行 int hashcode apple GetHashCode 在我的计算机 工作计算机和朋友的计算机上 结果是 1657858284 在开发服务器上 结果是 1548091822 有没有办法让我告诉项目始终使 G
  • 如何使用 Spring Data JPA + Spring Web MVC 避免 JSON 序列化中的延迟获取?

    我有一个在 Spring Web MVC 中使用 Spring Data JPA 和 REST 控制器的解决方案 持久性提供者是 Hibernate 持久层是使用 Spring 存储库构建的 并且在 REST 控制器和存储库之间存在一个服务
  • 从 Sidekiq 作业中获取错误消息

    我想从 sidekiq 作业中获取异常错误消息 当我将 back trace 选项设置为 true 时 它 会重试我的工作 但我想在出现错误时退出工作并获取错误消息 如果我发现该过程成功或失败就足够了 def perform text be
  • XmlReader ReadStartElement 导致 XmlException

    我正在 Silverlight 项目中使用 XmlReader 编写文件读取器 但是 我遇到了一些错误 特别是在 XmlReader ReadStartElement 方法周围 这让我相信我误解了如何在某个地方使用它 基本上 这是我正在使用
  • 超出地理编码 API 的使用限制

    当访问以下链接时 http maps googleapis com maps api geocode json http maps googleapis com maps api geocode json 我得到回应 error messa
  • 检查对象是否类似于数组

    有没有办法检查一个对象是否是 类似数组 就像这些类型的对象一样 数组 废话 类型化数组 Uint8Array 等 当Array isArray is used 参数对象 节点列表 还有一些我一时想不起来的 我想你可以检查是否存在 lengt
  • php - 将数组提取到全局变量中

    提取 手册 http php net manual en function extract php显示您可以提取一个数组 如下所示 extract array one gt 1 two gt 2 变成 一 二 但 extract 函数不返回
  • URLDownloadToCacheFile 失败,HRESULT '-2146697208'

    我在安装 ClickOnce vb net Windows 窗体应用程序时遇到问题 我尝试了本网站上建议的一些解决方案 但没有一个有帮助 我的应用程序是使用 VS2010 NET 4 0 Framework 构建的 并部署到我的开发计算机上
  • Android:解析 HTML 代码块

    我有以下 HTML 代码 我需要对其进行解析以检索玩家姓名和他得分的得分 在本例中为 Ross Taylor 和 9 解析此信息的最佳方法是什么 不想使用 HTML 解析器 REGEX 是最好的方法吗 我知道人们强烈反对这一点 但我只想要这
  • 如何在 C/C++ 中以编程方式查找“Saved Games”文件夹?

    我正在写一个游戏 我计划将保存存储在 保存的游戏 目录中 如何以编程方式查找 已保存游戏 文件夹的位置 它需要在非英语 Windows 上运行 黑客喜欢 USERPROFILE Saved Games不是一个选择 保存的游戏目录可以通过SH
  • 如何有效地随机选择数组项而不重复?

    我知道这个问题有很多形式 但我一直无法找到与我的具体效率问题相关的答案 我有下面的代码 效果很好 我有一个包含 10 个项目的数组 我从中随机选择一个项目 按 Enter 键时 该代码保留了一个由 5 个最近选择组成的数组 这些选择不能随机
  • 在 IE7 中,parent.document.getElementById("...") 为 null 或不是对象

    我做了一些研究 但作为一个 JavaScript 新手 我似乎无法为我的具体情况找到任何有用的东西 我的页面中有一个 iframe 在该 iframe 的文档中 我有以下代码 function fun var slideTitle api
  • 如何使用Jquery获取按钮的id值?

    我有一个带有动态创建的编辑按钮的表格 按钮的 ID 是一个字符串 附加有表内容 ID IE
  • PowerShell 脚本返回意外输出(随机数)

    Problem我正在 PowerShell 中编写一个脚本 将文件上传到 http 服务器 上传成功完成 但执行时在控制台中返回一堆数字 远远超过下面显示的数字 Output 这是我正在运行的脚本 Param Parameter Manda
  • 在 Prolog 中解决文本逻辑难题 - 查找生日和月份

    我正在阅读 7天7种语言 一书 并且已经读到了Prolog章节 作为学习练习 我试图解决一些文本逻辑难题 谜题如下 五姐妹的生日都在不同的月份 并且各自在一周的不同日期 使用下面的线索 确定每个姐妹的生日是在月份和星期几 宝拉出生于三月 但
  • JS:如何检查按钮是否被禁用?

    我想检查按下或未按下的按钮 我怎样才能做到呢 我已经尝试过这样做 但它不起作用 这是我的代码
  • 现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)?

    以下代码在 c 14 中的 gcc 和 clang 下均无法编译 但在 c 1z 中编译成功 struct Cls static constexpr int N 0 constexpr int Cls N constexpr int Cls