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 使用静态函数初始化静态成员 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 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