为什么 if constexpr 不能使这个核心常量表达式错误消失?

2023-12-10

在参照这个问题。用于初始化的核心常量表达式constexpr多变的y格式不正确。这么多是给定的。

但如果我尝试转动if进入一个if constexpr:

template <typename T>
void foo() {
    constexpr int x = -1;
    if constexpr (x >= 0){
        constexpr int y = 1 << x;
    }
}

int main(){
    foo<int>();
}

错误仍然存​​在。 GCC 7.2 仍然给出:

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

但我认为语义检查应该在废弃的分支上不执行。

通过a进行间接constexpr然而 lambda 确实有帮助:

template <typename T>
void foo(){
    constexpr int x = -1;
    constexpr auto p = []() constexpr { return x; };
    if constexpr (x >= 0){
        constexpr int y = 1<<p();
    }
}

The constexpr说明符y似乎改变了检查废弃分支的方式。这是预期的行为吗?


@max66很友善地检查了其他实现。他报告说,GCC (7.2.0 / Head 8.0.0) 和 Clang (5.0.0 / Head 6.0.0) 都可以重现该错误。


该标准并没有过多说明废弃的声明 of an if constexpr。 [stmt.if] 中基本上有两个关于这些的陈述:

  1. 在封闭模板中,废弃的语句不会被实例化。
  2. 从废弃语句引用的名称不需要定义 ODR。

这些都不适用于您的使用:编译器抱怨的是正确的constexpr如果初始化。请注意,当您想要利用模板参数时,您需要使条件依赖于模板参数实例化失败:如果该值不依赖于模板参数,则当模板参数为defined。例如,这段代码仍然失败:

template <typename T>
void f() {
    constexpr int x = -1;
    if constexpr (x >= 0){
        constexpr int y = 1<<x;
    }
}

但是,如果你使x取决于类型T没关系,即使当f实例化为int:

template <typename T>
void f() {
    constexpr T x = -1;
    if constexpr (x >= 0){
        constexpr int y = 1<<x;
    }
}
int main() {
    f<int>();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 if constexpr 不能使这个核心常量表达式错误消失? 的相关文章

随机推荐

  • 获取node.js应用程序的公共IP地址

    是否有任何node js模块可用于获取发出请求的客户端计算机的公共IP地址 我不是指 IPv4 或 IPv6 我需要像您访问时获得的公共 IPhttp www whatismyip com 我努力了req connection remote
  • 如何从关系中删除子对象或父对象?

    我做了一个有更多关系的小应用程序 现在我想删除我的表的详细信息我该如何删除我没有任何要删除的想法 关系如下 泛卡 gt 员工 一对一 员工 gt 项目经理 与员工双向多对一关联 项目 gt 项目经理 与项目的双向多对一关联 现在我想把表数据
  • Spring Boot Whitelabel 错误页面

    我坚持使用这个简单的 MVC 示例 当我启动应用程序并转到 localhost 8080 时 我收到 Whitelabel 错误页面 即使我在 src main resources templates 中创建了 index html 我还在
  • 在 Visual Studio Team Services 路径中找不到curl

    我正在使用托管代理在 Visual Studio Team Services 中进行发布管理 我有一个cURL上传文件我的发布定义任务上周开始工作 并且在过去几周我已经成功进行了几次部署 今天 我从相同的版本定义创建了一个新版本 并且在cU
  • 角度 cli 升级后重新安装角度通用

    我升级了我的angular cli从6版本到8 1 Angular universal改变了简单的施工方法 nguniversal module map ngfactory loader 我应该重新部署 清除旧的配置 run ng add
  • 将 Google 脚本插件发布到 G Suite Marketplace SDK

    我有一些 Google Sheet 脚本代码 我想将其提取到 Google Sheet Addon 中 以便仅在我们的域 而不是公共网络 中发布 我团队中的个人过去曾成功地做到过这一点 但之后2019 年 1 月 25 日 Google 从
  • awk 打印匹配的列如果存在则打印未找到

    我的文本文件如下所示 date 2017 10 10 ip 192 168 1 1 22 inbound 100 outbound 100 date 2017 10 10 ip 192 168 1 1 22 inbound 100 date
  • LINQ to SQL IsDiscriminator 列不能继承吗?

    我正在设计我的数据库和 LINQ To SQL ASP NET Web 应用程序 想象一下我有两种类型的页面 普通页面和根页面 有些页面是根 有些页面不是 我有一个 Page 数据库表和一个 RootPage 数据库表 Page PK Pa
  • 未检测到 OWIN 启动类

    我试图在现有应用程序中实现 OWIN WS Federation 它是一个使用 asp net VB 编写的 Web 应用程序 我已经添加了 Nugetpackages 中的所有引用添加的参考文献列表 然后我将启动类添加到 2 个文件中作为
  • 如何指定Ubuntu中CMake的安装位置?

    我已经下载了cmake 3 11 3 Linux x86 64 sh文件 然后我执行它并创建了一个文件夹 其中包含bin文件有cmake在上面 我尝试编辑 etc environment像这样 PATH usr local sbin usr
  • Java 限制上传速度?

    我想以编程方式限制 Java 中的上传或下载操作 我假设我需要做的就是检查上传速度并插入Thread sleep 因此像这样 while file hasMoreLines String line file readLine for int
  • Selenium Webdriver:如何获取当前页面中的所有cookie

    尝试使用 Chrome 驱动程序和 java 获取当前页面中的所有 cookie 请帮助我在关闭浏览器并尝试使用旧 cookie 打开新浏览器后检索页面中的所有 cookie 使用 WebDriver API 网址为 http seleni
  • c# xml反序列化为xsi中带有冒号和连字符的对象:类型值

    当我尝试使用以下方法将 XML 文件反序列化为对象时遇到问题XmlSerializer class 我的 XML 文件如下所示
  • 安装 Bower 时出错(ERR!tar.unpack 解压错误)

    我在尝试安装 Bower 时收到此错误 这是一个错误还是我做错了 如果需要的话 我还有 4707 行 npm debug log 文件 Thanks 这是尝试在本地安装 Bower 时来自终端的转储 但我在全局尝试时遇到相同的错误 npm
  • 如何使用 Graph API 让用户订阅 facebook 中的事件?

    我希望用户在添加到此网站活动注册时也能在 Facebook 上订阅该活动 系统已经请求 create event 额外权限 我没有找到如何在用户通过图形 API 登录后订阅特定事件 我怎样才能做到这一点 Thanks Joe 它记录在eve
  • 上传视频时出现TokenMismatchException?

    上传图像时 laravel 会顺利完成所有事情 没有戏剧 一旦我上传视频文件 不 弹出 verifyCsrfToken php 第 46 行中的 TokenMismatchException 我有一个验证器 fileVali Validat
  • Java中int[]数组转换为short[]数组

    我有一个int我为其分配了 100 个元素空间的数组 还有另一个数组inShort 我怎样才能转换inInt to inShort 是否需要分配新的内存inShort 或者有一种方法我可以通过它投射到inInt int inInt new
  • 在 Python 中使用 range() 时出现内存错误 (2.7.4)

    好吧 我在 StackOverflow 上浏览了很多有关 MemoryError 的问题 但找不到满意的答案 我在配备 2GB RAM 的笔记本电脑上运行 Ubuntu 13 04 Gnome 64 位 当我编写以下 Python 代码时
  • 使用 Python 将无聊的事情自动化。逗号代码[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 In 使用 Python 自动化处理无聊的事情 有一个练习项目叫Comma Code 假设您有一个如下所示的列表值 spam apples bananas tofu cats 编
  • 为什么 if constexpr 不能使这个核心常量表达式错误消失?

    在参照这个问题 用于初始化的核心常量表达式constexpr多变的y格式不正确 这么多是给定的 但如果我尝试转动if进入一个if constexpr template