constexpr 计算负位移位时未定义的行为?

2024-01-09

考虑以下代码片段:

int main(){
    constexpr int x = -1;
    if(x >= 0){
        constexpr int y = 1<<x;
    }
}

GCC 7(可能还有 GCC 的其他版本)拒绝编译这个并说:

error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]

我可以猜测这可能来自哪里:constexpr声明于y让 GCC 评估y在编译时,它可能是负数。删除constexpr修复错误。

然而,这是标准未定义的行为吗?条件始终为假,因此值y永远不会被使用。

在我的实际代码中,x是一个模板参数,可以为负数,也可以不是。


GCC 抱怨是因为你的定义y显然是一个格式错误的constexpr宣言。初始值违反了[表达式.const]/2 https://timsong-cpp.github.io/cppwp/n4659/expr.const#2,其中指定:

表达式 e 是 a核心常量表达式 unless这 遵循抽象机的规则,对 e 的求值将 评估以下表达式之一:

  • 具有本国际标准的条款 [intro] 至 [cpp] 中指定的未定义行为的操作 [ 注: 例如,包括有符号整数溢出(子句 [expr]), 某些指针算术([expr.add]),除以零,或者 某些轮班操作——《尾注》];

所以你不能使用1<<x初始化y。分支永远不会被执行并可以被消除,这并不重要。 GCC 仍然有义务验证它在语义上的正确性。

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

constexpr 计算负位移位时未定义的行为? 的相关文章

随机推荐

  • 检查 servlet 和 jsp 中的会话

    在我的网络应用程序中 我需要检查会话是否存在 我想在我的 servlet 和 jsp 中检查这一点 有什么方法可以检查这个吗 Thanks 你可以测试它HttpServletRequest getSession boolean create
  • Android-从 DatePickerDialogFragment 中删除 Calendarview

    我有一个工作正常的 Datepickerdialog 片段 当我单击按钮时 datepickerdialog 将打开 左侧有微调器日期选择 右侧有日历视图 对于我在一个地方的应用程序 我只想单独显示微调器日期选择部分 必须删除或隐藏日历视图
  • 将图像转换为 HTML/CSS 中的灰度

    有没有一种简单的方法可以仅用灰度显示彩色位图HTML CSS 它不需要与 IE 兼容 我想也不会 如果它能在 FF3 和 或 Sf3 中工作 那对我来说就足够了 我知道我可以同时做到SVG和 Canvas 但现在看来工作量很大 有真正懒人的
  • 合并到分支,合并到哪一个并不重要?

    git 版本 1 7 5 4 我有大约5个分支机构 全部来自同一个初始分支 我想将 2 个分支合并在一起 比如说 branch1 和branch2 这些分支有很多差异 我目前正在分支 1 上工作 刚刚意识到我在分支 2 中实现了一些我想要在
  • 在twopi (Graphviz) 中控制间距

    我是 Graphviz 的新手 我正在尝试绘制一棵以实体为中心的树 我正在使用twopi命令 如果我把overlap true即使重叠标签周围有很多空间 它也会重叠 如果我把overlap false 标签变得太小 如何才能拥有第一种情况而
  • 如何在每次加载页面时仅重新加载一次

    我有一个 JSP 页面 即使在删除其中一项内容后 该页面仍显示以前的内容 我正在努力寻找问题 但我需要快速解决此问题 我在这方面很弱JavaScript所以请帮帮我 我需要一个JavaScript每次访问页面时都会自动重新加载页面 重新加载
  • 按日期范围和分类变量合并数据集

    假设我有两个数据集 一个包含带有开始 结束日期的促销列表 另一个包含每个计划的每月销售数据 promotions data frame start date as Date c 2012 01 01 2012 06 14 2012 02 0
  • 汉字显示为问号

    之前已经问过这个问题 但我不知道出了什么问题 我正在使用 phantomjs 打印 pdf render 呈现的页面基本上是具有以下属性的本地静态站点 font normal 17px helvetica arial verdana san
  • 使用 htaccess 在标头内设置文件名

    我们有一个从服务器下载文件的应用程序 下载后 需要保存它 因为它使用来自响应标头的文件名参数 当我使用标准 PHP 时download php id downloadID我可以毫无问题地设置标题 现在的任务是在客户端服务器上没有任何可用的
  • 我应该在 Promise 中使用 `return` 吗?

    function saveToTheDb value return new Promise function resolve reject db values insert value function err user remember
  • OpenGL中的glRotate是旋转相机还是旋转世界轴还是旋转模型对象?

    我想知道是否glRotate旋转相机 世界轴或对象 通过例子解释它们有何不同 相机 OpenGL 中没有相机 世界轴 OpenGL 中没有世界 或物体 OpenGL 中没有对象 使困惑 OpenGL 是一个绘图系统 可使用点 线和三角形进行
  • 为了记录目的而捕获 RuntimeException 是一种不好的做法吗?

    我发现捕获 RuntimeException 通常被认为是不好的做法 因为它们无法纠正并且通常是程序员错误 然而 我们有一个 疯狂的 大型应用程序 其中任何部分的更改都可能产生不可预见的后果 是的 这本身就是一个问题 现在 我们开始在应用程
  • 在android中使用Smack的ejabberd连接给出连接超时错误

    您好 我们已经从以下位置下载了 ejabberd this https docs ejabberd im admin installation install on windows 域是localhost我们已将 xmppDomain 设置
  • 使用 Assert 注释的 Symfony2 验证不起作用

    Update 由于我没有得到任何答案 因此我使用一个更简单的示例重写了整个帖子 希望这有助于揭露问题 我在表单验证方面遇到问题 我可以让 NotBlank 断言起作用 但 Type 对我不起作用 首先 这是代码 Entity LineIte
  • 使用 phantomjs 获取动态内容,并可能存在 scrapy 和 selenium 竞争条件

    首先 这是这里的后续问题 更改正在运行的蜘蛛数量 scrapyd https stackoverflow com questions 24960303 change number of running spiders scrapyd 我使用
  • php/regex:“linkify”博客标题

    我正在尝试编写一个简单的 PHP 函数 它可以接受像这样的字符串 Topic Some stuff Maybe some more it s my stuff 并返回 topic some stuff maybe some more its
  • java中如何获取JSON对象的所有节点和子节点?

    我想获取以下 JSON 对象的所有节点 例如结果 身份 付款等 result identification transactionid Merchant Assigned ID uniqueid d91ac8ff6e9945b8a125d6
  • lm() 函数在 SolusOS Linux 上给出的结果与在 Windows 上不同

    I run SolusOSLinux 发行版 4 0 R 3 6 1 和 Windows Windows 10 R 3 5 2 My code library datasets fit2 lt lm Sepal Length Sepal W
  • 通过变量访问Go函数[重复]

    这个问题在这里已经有答案了 我刚刚开始学习 Go 有些事情引起了我的注意 功能如下 delete map Answer for maps append slice 0 for slices len slice cap slice again
  • constexpr 计算负位移位时未定义的行为?

    考虑以下代码片段 int main constexpr int x 1 if x gt 0 constexpr int y 1 lt