constexpr 使用静态函数初始化静态成员

2023-12-14

要求

我想要一个constexpr值(即编译时常量)计算自constexpr功能。我希望这两个范围都限定在类的命名空间内,即类的静态方法和静态成员。

第一次尝试

我首先以(对我来说)显而易见的方式写下这个:

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};

g++-4.5.3 -std=gnu++0x对此说:

error: ‘static int C1::foo(int)’ cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression

g++-4.6.3 -std=gnu++0x抱怨:

error: field initializer is not constant

第二次尝试

好吧,我想,也许我必须将一些东西移出班级主体。所以我尝试了以下方法:

class C2 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));

g++-4.5.3将毫无怨言地编译它。不幸的是,我的其他代码使用了一些基于范围的for循环,所以我必须至少有 4.6。现在我仔细观察支持名单, 看起来constexpr也需要 4.6。与g++-4.6.3 I get

3:24: error: constexpr static data member ‘bar’ must have an initializer
5:19: error: redeclaration ‘C2::bar’ differs in ‘constexpr’
3:24: error: from previous declaration ‘C2::bar’
5:19: error: ‘C2::bar’ declared ‘constexpr’ outside its class
5:19: error: declaration of ‘const int C2::bar’ outside of class is not definition [-fpermissive]

这对我来说真的很奇怪。事物如何“不同”constexpr“ 这里?我不想添加-fpermissive因为我更喜欢严格检查我的其他代码。移动foo在类体之外的实现没有明显的效果。

预期答案

有人可以解释一下这是怎么回事吗?我怎样才能实现我想要做的事情?我主要对以下类型的答案感兴趣:

  • 在 gcc-4.6 中实现此功能的方法
  • 观察到更高版本的 gcc 可以正确处理其中一个版本
  • 指向规范的指针,至少我的一个构造根据该规范should工作,这样我就可以向 gcc 开发人员发出关于实际让它工作的问题
  • 根据规范,我想要的信息是不可能的,最好对这个限制背后的基本原理有一些了解

其他有用的答案也受到欢迎,但可能不会那么容易被接受。


该标准要求(第 9.4.2 节):

A static文字类型的数据成员可以在类定义中声明constexpr说明符;如果是这样,其声明应指定大括号或等于初始化器其中每个初始化子句那是一个赋值表达式是一个常量表达式。

在你的“第二次尝试”和伊利亚答案中的代码中,声明没有大括号或等于初始化器.

您的第一个代码是正确的。不幸的是 gcc 4.6 不接受它,而且我不知道在哪里可以方便地尝试 4.7.x(例如 ideone.com 仍然停留在 gcc 4.5 上)。

这是不可能的,因为不幸的是标准不允许初始化静态constexpr类完整的任何上下文中的数据成员。特殊规则为大括号或等号初始化器9.2p2中仅适用于非静态数据成员,但这一个是静态的。

最可能的原因是constexpr变量必须可用作成员函数体内的编译时常量表达式,因此变量初始值设定项在函数体之前完全定义 - 这意味着该函数在初始值设定项的上下文中仍然不完整(未定义),并且然后这条规则生效,使表达式不是常量表达式:

未定义的调用constexpr函数或未定义的constexpra 定义之外的构造函数constexpr函数或constexpr构造函数;

考虑:

class C1
{
  constexpr static int foo(int x) { return x + bar; }
  constexpr static int bar = foo(sizeof(int));
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr 使用静态函数初始化静态成员 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 按成员序列化

    我已经实现了template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • MYSQL REGEXP 在 JSON 字符串中搜索

    我是 regexp 的初学者 我尝试在 json 格式的文本中搜索 但我无法使其正常工作 SELECT DISTINCT tag body FROM pages WHERE body REGEXP BINARY listeListeOuiN
  • 动态绘图在 IDLE 中有效,但在 Jupyter Notebook 中无效

    下面的代码在空闲状态下运行时工作正常 Python 3 6 空闲状态 import matplotlib pyplot as plt import time import random matplotlib inline ysample r
  • 让柱形图在图表控件中重叠

    我有以下问题 我需要在图表控件中显示多个列 一个图表区域中大约有七个系列 现在 当我有一个 列 类型的图表时 所有七列都会并排显示 我想做的就是将它们重叠 这可能吗 以下两个解决方案对我没有帮助 绘制重叠柱形图或条形图 图表控制两个数据集条
  • 当前无法从软件更新服务器获取 Xcode

    更新到 OS X 10 9 后 我的 macport 出现问题 我尝试遵循本手册https trac macports org wiki Migration修复它们 但是当我安装命令行工具时 xcode 选择 安装 我收到消息 无法安装该软
  • Keras 卷积层维数不匹配

    我正在尝试使用 Keras 来构建我的第一个神经网络 我的经验为零 我似乎无法弄清楚为什么我的维度不正确 我无法从他们的文档中弄清楚这个错误在抱怨什么 甚至是哪个层导致了它 我的模型接受 32 字节的数字数组 并应该在另一侧给出一个布尔值
  • 如何防止实体框架在 SQL Server 中生成低效查询?

    我在 EF 4 0 中定义了一个基于视图的实体 该视图位于一个包含大约 1800 万行数据的表上 我选择了实体的 4 个确定性属性作为该实体的复合实体键 我已通过 OData WCF 数据服务公开了对包含此视图的模型的访问 WCF 数据服务
  • 全屏视频视图未居中

    我使用此 XML 布局在我的活动中显示全屏 VideoView 视频是全屏的 但不居中 在横向模式下 它停留在屏幕左侧 并在屏幕右侧留下一些空白 如何使我的 VideoView 放置在屏幕中央
  • 查找 data.frame 中每列的频率

    我有一个如下的数据框 我想找到每列的频率 数据框 No Location Age Size Gender 1 Trinidad 25 3 1 2 Asin 33 2 2 3 Trinidad 33 5 2 4 Trinidad 23 3 1
  • “ascii”编解码器无法解码字节(使用 django 时出现问题)

    我用 python 编写了一个简单的 html 解析类 它似乎工作正常 然后我尝试将它与 django 一起使用 但出现此错误 ascii codec can t decode byte 0xc2 in position 54465 ord
  • 无法让 jQuery Ajax 解析 JSON Web 服务结果

    我已经验证了我的 C Webmethod 的 JSON 响应 所以我不认为这是问题所在 我尝试使用简单的 jQuery ajax 解析结果 但无论出于何种原因 我无法获得正确触发和解析结果的方法 顺便说一句 似乎也无法获得触发结果的函数 它
  • Java JComboBox 监听更改选择事件[重复]

    这个问题在这里已经有答案了 我正在尝试监听 Java JComboBox 中的选择更改 我尝试使用 ActionListener 但问题是这样的 动作侦听器执行类似的操作 public void actionPerformed Action
  • 文本列上的 SQL INNER JOIN

    我有两个表 设备和软件 我想要做一个INNER JOIN在 他们都有一个名为 EQCN 的字段 它是一个文本字段 我收到以下错误 数据类型 text 和 text 在等于运算符中不兼容 必须有办法解决这个问题 将这些列的数据类型更改为var
  • 滚动时间窗口上的 pandas `value_counts`

    我有一个包含字符串值和日期时间索引的 pandas 数据框 如下所示 from datetime import datetime as dt import pandas as pd df pd DataFrame a b b c b b b
  • 共享控制以维护 One-Drive 上的 Access 数据库

    我们有一个中央 Access 数据库 附有较小的外围数据库 我们希望不在同一地点的多个用户可以通过网络使用该数据库 目前我们的数据库位于 OneDrive 上 我们还想在编辑数据库时锁定数据库 我看到 StackOverflow 上有一篇
  • 如何在 firebase 托管 (node.js) 中返回 204 响应代码

    需要一些帮助 我正在尝试使用 android 应用程序访问 firebase 托管上的文件 该应用程序正在下载 txt 文件 并且出于验证原因 在开始下载之前 它应该检查服务器是否可访问 它需要 204 响应代码 没有内容 我可以在 PHP
  • “报告为空” - 是错误吗?

    我已经在 iReport 中创建了带有 3 个参数的报告 并且它运行成功 该报告是使用 3 个参数执行 MS SQL 存储过程 开始日期 enddate dept nm 部门名称 iReport 给出了很好的结果 当我将 jrxml 文件导
  • 全屏iframe高度为100%

    所有浏览器都支持 iframe height 100 吗 我使用 doctype 作为 在我的 iframe 代码中 如果我说 我的意思是它实际上会占据剩余页面的高度 因为顶部有另一个框架 其固定高度为 50px 所有主要浏览器 IE Fi
  • ADFS 2.0 无效名称 ID 策略

    我已经在 adfs 信赖方信任上配置了一个应用程序 因此我可以使用 adfs sso 登录 之后 我安装了 simplesamlphp 来处理该登录 并处理响应 saml 这是我的 authsources 配置 myauth gt arra
  • 关于 iPhone 的方向

    如何获取iPhone当前的方向 我浏览了这个网站 发现了以下两种方法 UIApplication共享应用程序 statusBarOrientation UIDevice currentDevice 方向 哪一种是获取当前方向的正确方法 我在
  • constexpr 使用静态函数初始化静态成员

    要求 我想要一个constexpr值 即编译时常量 计算自constexpr功能 我希望这两个范围都限定在类的命名空间内 即类的静态方法和静态成员 第一次尝试 我首先以 对我来说 显而易见的方式写下这个 class C1 constexpr