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 中的常量表达式中是否允许使用逗号运算符? 的相关文章

随机推荐

  • 适用于 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