C++11 中的常量表达式中是否允许使用逗号运算符?

2024-01-02

在回答的过程中这个问题关于SO https://stackoverflow.com/questions/16563114/are-these-null-pointers-or-are-they-pointers-to-address-0/16564608?noredirect=1#comment23807331_16564608对于 C++11,我意识到在 C++03(以及 C)中,在 a 中明确禁止使用逗号运算符。常量表达式.

C++03 标准关于常量表达式的第 5.19/1 段说:

[...] 特别是,除了 sizeof 表达式、函数、类对象、指针或 不得使用引用,以及赋值、递增、递减、函数调用或逗号运算符应 不被使用.

然而,在 C++11 中,最后一部分提到逗号运算符似乎消失了。虽然 C++11 标准第 5.19/2 段明确规定了赋值、递增、递减和非constexpr函数调用表达式不应作为 a 的子表达式出现常量表达式,逗号运算符的使用似乎不再被禁止。

例如,以下程序在 GCC 4.7.2 和 Clang 3.3 上可以正常编译std=c++11(除了编译器警告说逗号运算符无效并且x and arr变量未使用):

int main()
{
    constexpr int x = (0, 42);
    int arr[(0, 42)];
}

然而,必须说的是,即使下面的程序也可以很好地编译-std=c++03选项(在 Clang 和 GCC 上),这显然是not正确的是,上面引用了 C++03 标准:

int main()
{
    int arr[(0, 42)];
}

问题:

关于常量表达式中是否允许使用逗号运算符,C++03 和 C++11 之间是否存在差异,或者我是否遗漏了某些内容?

作为一个额外的(非建设性的)问题,我有兴趣知道为什么逗号运算符不能在 C++03 的常量表达式中使用。


  1. 是的,我相信这是 C++03 和 C++11 之间的变化。我相信这样做的大致原因是您提到的——没有特别充分的理由逗号运算符不能成为常量表达式的一部分。

  2. 我相信 C++03 中的规则源自 C 中的规则(C90,§6.4):

常量表达式不得包含赋值、递增、递减、函数调用或逗号运算符,除非它们包含在 a 的操作数中。sizeof操作员。

至于为什么在 C 的常量表达式中禁止使用逗号运算符,我只能推测。我的直接猜测是确保这样的定义:

int x[5, 2];

……会被拒绝。如果允许,它可能会导致程序员错误地认为他定义了一个 5x2 元素数组(总共 10 个元素),而实际上(如果允许使用逗号运算符)他实际上定义了x只有 2 个元素(并且5实际上被完全忽略了)。

至于为什么 C++ 委员会认为这是比 C 委员会更可接受的风险,我猜这可以归结为一个相当简单的情况:C 几乎没有提供替代方案,因此数组被大量使用。另一方面,C++ 提供了这两种功能std::array and std::vector,极少数情况下有很多理由使用“原始”数组,因此出现问题的可能性要小得多。

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

C++11 中的常量表达式中是否允许使用逗号运算符? 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 适用于 iPhoneSDK 的 Bing 地图

    有谁知道如何使用 bing 地图创建简单的 iPhone 应用程序 Bing Mobile Bing Maps 团队于 2011 年 5 月上旬发布了适用于 iPhone 和 iPad 的新 Bing Maps iOS SDK 您可以下载该
  • asp.net MVC 解决方案/项目布局 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这更多的是一个开放性问题 而不是寻找一个具体的答案 众所周知 没有一个答案适合所有解决方案 但我很想知道您如何构建 ASP NET MVC 解决
  • 有没有办法使用 JavaScript 引入 Internet Explorer 条件注释?

    我有一段 HTML 代码 其中包含条件注释 该代码经过测试 在初始页面呈现时包含在页面的 HEAD 部分中时可以正常工作 我想在 Ajax 响应中使用 JavaScript 将相同的条件 CSS 引入到现有页面 我努力了 var comme
  • Databricks 仅打印大约 280 行数据

    我正在 Databricks 中运行一些大型作业 目前包括盘点数据湖 我正在尝试打印前缀 子文件夹 内的所有 blob 名称 这些子文件夹中有很多文件 我打印了大约 280 行文件名 但随后我看到了以下内容 WARNING skipped
  • PHP 还是普通 Perl CGI 更快?

    我正在为 Apache 共享托管服务器开发一个 Web 应用程序 我已经用 Perl 编写了一些代码 但最近令我惊讶的是 我发现共享托管提供商没有提供 mod perl 或安装它的方法 我一直有点担心在没有 mod perl 的情况下通过
  • py.test 将消息和测试结果/断言记录到单个文件中

    我现在开始使用 py test 来开发一个新项目 我们正在配置 Linux 服务器 我需要编写一个脚本来检查这些服务器的设置和配置 我认为 py test 是实现这些测试的好方法 并且到目前为止它运行得很好 我现在面临的问题是 我需要在这些
  • 为什么保存到名为 temp 的文件夹会导致 Matlab 中 for 循环中的数据加载速度变慢?

    重要更新 我刚刚发现 重新启动 Matlab 和计算机后 这个简化的代码也不再为我重现问题 我很抱歉占用您的时间在一个不起作用的脚本上 但是 如果我在内部 for 循环中的任何文件夹 我已经尝试过 中保存任何内容 老问题仍然存在于我的原始脚
  • 返回时重新加载 UITableView?

    我有顶级水平UIViewController其中包含一个UITableView 顶层UIViewController实例化一个NavigationController 并推动另一个UIViewController到NavigationCon
  • 识别上下文菜单中选择的视图 (Android)

    在安卓中 onContextItemSelected有一个MenuItem参数 因此不清楚如何识别所选视图 MenuItem getMenuInfo http developer android com reference android
  • pip:强制安装忽略依赖项

    有没有办法强制安装 pip python 包 忽略所有无法满足的依赖项 我不在乎这样做有多么 错误 我只是需要这样做 抛开任何逻辑和推理 点有一个 no dependencies转变 你应该使用它 欲了解更多信息 请运行pip instal
  • 如何在android中的videoview中播放.mp4视频?

    我正在开发视频播放器应用程序 我想播放 mp4本机视频视图中的视频 我无法使用 URL 播放视频 我收到错误 抱歉 这部影片无法播放 而且我也无法在本机视频视图中播放下载的视频 我在视频视图中播放视频的代码 String mUrl http
  • 检测视频是否应用了“faststart”

    在 MP4 上运行 qt faststart 时 您实际上是从后面获取元数据并将其放在文件的前面 就我而言 Flash 可以在视频完全加载之前正确开始播放视频 我有大量视频 我正在通过 shell 脚本运行并连夜进行编码 然而 当我上传时
  • 创建日历以在 Jasper 服务器中选择日期(和时间)

    在此输入图像描述 https i stack imgur com w0sgy png jtsnr 来自 jasper 服务器的快照 我在文本框 Dateto 外部单击 然后显示日历 但如前面的示例所示 框外没有日历图标 此外 文本框接受输入
  • unity 2D 玩家运动参数不存在

    我已经成功制作了一个自上而下的射击游戏 现在我正在研究动画 我已经遵循了 Pixelnest io 的几个教程 但奇怪的是 我收到一个错误 说 参数 moveRight 不存在 unity 中的动画对我来说是全新的 并且一直在尝试尽可能多地
  • NestedScrollview 中的 RecyclerView 替代品

    我有一个具有此层次结构的布局 有时我需要更新我的 recyclerview 元素 但它冻结了主线程 我猜是因为滚动视图需要再次测量它 我真的很想知道我应该怎么做 用layoutinflater 替换recyclerview Recycler
  • 从ios本机代码访问AsyncStorage中存储的数据(目标c)

    我需要从 iOS 本机 Objective C 代码访问存储在 AsyncStorage 中的数据 这是需要同步数据的 而不是将 App 事件发送到 JS 然后将其发送回本机代码 我刚刚遇到了同样的问题 我的解决方案是将代码移至本机侧 On
  • 为什么不按照词法封闭的“define”来实现“let”?

    我已经使用 lisp 家族语言工作了好几年 感觉我对它们有了很好的掌握 我现在正在编写自己的 lisp 当然 这是一种时尚 但几乎完全避免重新实现 Scheme Common Lisp 和朋友使用过的相同模式 我总是觉得奇怪的一件事是所有的
  • 来自数据库的 之间的 PHP eval() 代码

    我希望能够将 PHP 放入数据库并运行它 我必须这样做 因为我将页面布局存储在数据库中 并且每个页面布局彼此不同 但是在某些情况下 我想对某些页面使用动态内容 Assume query from db是从数据库返回的字符串 PHP 应该只
  • NDIS 和微型端口驱动程序

    我正在尝试使用 Visual Studio 2012 中提供的 WDK 工具修改以太网驱动程序 WDK 中提供的示例包括 微型端口适配器 和 NDIS 轻量级过滤器 等 我仍处于驱动程序编写的最初阶段 因此发现很难浏览代码 在 Visual
  • C++11 中的常量表达式中是否允许使用逗号运算符?

    在回答的过程中这个问题关于SO https stackoverflow com questions 16563114 are these null pointers or are they pointers to address 0 165