我需要将 constexpr 放在 else-if 之后吗?

2024-01-03

灵感来自这个答案 https://stackoverflow.com/a/52355930/7151494,我尝试复制并粘贴(并在中添加测试main())这段代码:

template<typename T>
std::tuple<int, double> foo(T a) {
    if constexpr (std::is_same_v<int, T>)
        return {a, 0.0};
    else if (std::is_same_v<double, T>)
        return {0, a};
    else
        return {0, 0.0};
}

int main() {
    auto [x, y] = foo("");
    std::cout << x << " " << y;
}

这非常简单 - 如果T推导为int,我们想要返回一个元组[a, 0.0]. If T推导为double,我们想要返回一个元组[0, a]。否则,我们想返回[0, 0.0].

如您所见,在main()函数,我正在调用foo with const char*论证,其中should导致x and y being 0。那是事实并非如此.

在尝试编译它时,我遇到了一个奇怪的错误:

错误:无法转换'{0, a}' from '<brace-enclosed initializer list>' to 'std::tuple<int, double>'

我当时就像what?。我到底为什么想要那个...我专门用过std::is_same启用return {0, a} only当类型为a推导为double.

于是我赶紧跑去参考参数 https://en.cppreference.com/w/cpp/language/if在 if-constexpr 上。在页面底部、上方Notes,我们可以看到这段代码:

extern int x; // no definition of x required
int f() {
if constexpr (true)
    return 0;
else if (x)
    return x;
else
    return -x;
}

我心想哦好吧..?我真的看不出原始代码有什么问题。它们使用相同的语法和语义.......

但我很好奇。我很好奇(当时)是否有一些奇怪的东西可以解决这个问题,所以我将原始代码更改为:

template<typename T>
std::tuple<int, double> foo(T a) {
    if constexpr (std::is_same_v<int, T>)
        return {a, 0.0};
    else if constexpr (std::is_same_v<double, T>) // notice the additional constexpr here
        return {0, a};
    else
        return {0, 0.0};
}

int main() {
    auto [x, y] = foo("");
    std::cout << x << " " << y;
}

瞧!代码按预期编译并执行。所以,我的问题是 -我们需要把constexpr每次之后if中的声明if-else在这种情况下的声明?或者只是我的编译器?我正在使用海湾合作委员会7.3。


在这种情况下,我们是否需要在 if-else 块中的每个 if 语句后面放置 constexpr ?

Yes. The else-if block1 is a lie :), there are only if blocks1 and else blocks1. This is how your code is seen by the compiler:

if constexpr (std::is_same_v<int, T>)
    return {a, 0.0};
else // {
    if (std::is_same_v<double, T>)
        return {0, a};
    else
        return {0, 0.0};
// }

else if (/*...*/)只是每个人都使用的格式约定。因此,您可以清楚地看到第二个constexpr是需要的。


1: "block" is not the correct terminology. if is a statement (with optional else part). A block is { /*...*/ }.

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

我需要将 constexpr 放在 else-if 之后吗? 的相关文章

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • R中的for循环和if函数

    我正在用 R 中的 if 函数编写一个循环 表格如下 ID category 1 a 1 b 1 c 2 a 2 b 3 a 3 b 4 a 5 a 我想使用 for 循环和 if 函数添加另一列来计算每个分组的 ID 如下所示的计数列 I
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 从 Angular 2 服务创建并返回 Observable

    这更多的是一个 最佳实践 问题 共有三名玩家 aComponent a Service and a Model The Component正在呼叫Service从数据库获取数据 这Service正在使用 this people http g
  • React redux oop 类

    来自角度 我曾经为数据库中的每个实体都有一个类 这样的类封装了所有实体行为 例如用户类可以看起来像 export class User static notValid u return u id u id gt 0 u fullname u
  • 关于多线程下载的缺点

    我有一个关于多线程下载的问题 正如您所知 使用多个线程下载可以提高应用程序的性能 但是有一些措施需要尊重 例如线程数 可用带宽等等 但我不太明白 为什么例如 使用多个线程可能会降低应用程序的性能 或者服务器的带宽 质量如何影响多线程应用程序
  • 如何将docker镜像打包到一个文件中

    我有一个名为 ubuntu dev update 15 的 5GB docker 镜像 它是我在本地 Ubuntu 14 开发机器上开发的 在该图像中 我拥有完成开发工作所需的一切 现在我需要能够将此映像发送到不同的 Linux 主机 这样
  • 有没有办法检查计算机的 AD 组成员身份?

    我正在尝试通过 Powershell 检查计算机组成员身份 我希望能够指定某个计算机名称并通过 Powershell 脚本查找该计算机所在的组 我计划在计算机上运行脚本 获取主机名 然后打印出该计算机所在的 AD 组 有没有一种简单的方法可
  • 类型 {1} 上不存在所需的属性 {0}。添加FK时实体框架(模型优先)

    我正在尝试将外键添加到数据库 然后更新模型 更新模型后 应用程序出现以下错误 System Data Entity Core MetadataException was unhandled HResult 2146232007 Messag
  • Linux - Bash - 获取 $releasever 和 $basearch 值?

    我正在编写一个 bash 脚本来使用 reposync 从远程存储库提取包 这样我就可以将我的节点指向本地提取 因此 我试图使本地存储库配置尽可能与 usptream 存储库配置相似 如下所示 upstream baseurl http m
  • 如何将我的图例组织成子组?

    我的条形图的图例当前在一个长列表中列出了图中的所有项目 我希望每列都有图例组 列数是动态的 因此图例必须能够相应调整 library phyloseq packageVersion phyloseq library ggplot2 libr
  • 如何在 Perl 中将简单数组编码为 JSON?

    我见过的所有在 Perl 中将对象编码为 JSON 字符串的示例都涉及哈希 如何将简单数组编码为 JSON 字符串 use strict use warnings use JSON my arr this is my array my js
  • 从 NSInspiration 获取参数值

    有人可以解释一下如何将值传递给使用时被拦截的不存在的方法 void forwardInvocation NSInvocation anInvocation NSMethodSignature methodSignatureForSelect
  • getLocationOnScreen/getLocationInWindow 中的坐标不正确

    致电getLocationOnScreen or getLocationInWindow 都给我一个top Y坐标大约 30px 状态 通知栏的高度 太低了 这left X坐标完全正确 正如我上面所暗示的 我相信差异是因为状态 通知栏 我可
  • 有没有一种简单的方法将 Swing 接口与数据源绑定

    我正在使用 WindowBuider 对 Swing 应用程序的管理部分进行编程 它基本上是充满了我需要对其进行 CRUD 操作的项目的表格 数据来自MySQL数据库 我可以手动完成 但是需要很长时间 有没有一种简单的方法可以做到这一点 使
  • 有人可以解释 Javascript 中 .indexOf() 的逻辑吗?

    function vowelsAndConsonants s var vowels a e i o u for let i 0 i
  • win32gui 获取当前活动应用程序名称

    我刚刚学习Python 对它来说相对论还很陌生 我创建了以下脚本 它将获取当前活动窗口标题并将其打印到窗口 import win32gui windowTile while True newWindowTile win32gui GetWi
  • Rails - 查看日志文件中生成的 SQL 查询

    有没有一种方法可以像在开发中一样在生产环境中查看 Rails 生成的所有查询 是的你可以 如果您进入 config environments production rb 文件 会有这样的部分 See everything in the lo
  • CSRF 令牌在登录期间过期

    我正在开发 Spring Web 应用程序 我需要避免登录页面上的 csrf 令牌过期问题 因为如果用户等待太长时间并尝试登录 解决 csrf 问题的唯一方法是重新加载页面并尝试再次登录 但这对用户不友好 我想避免这种情况 第一个问题 一般
  • 有什么方法可以以编程方式选择 TextView 中的文本吗?

    我有一个TextView我希望允许用户搜索特定的字符串 如果找到该字符串 它应该突出显示 使用背景跨度太慢而且很尴尬 所以我想弄清楚是否可以让它选择字符串 我知道与EditText这可以使用setSelection 但我不希望用户能够编辑文
  • 富文本框到字符串

    我有一个绑定到菜单项的富文本框 以允许粗体 斜体和下划线以及剪切 复制和粘贴 但是如何获取 RichTextBox 内容并将其从代码隐藏转换为字符串哪个将带有粗体 斜体等
  • 使用 Alamofire 处理超时

    是否可以为 Alamofire 请求添加超时处理程序 在我的项目中 我这样使用 Alamofire init let configuration NSURLSessionConfiguration defaultSessionConfigu
  • 我需要将 constexpr 放在 else-if 之后吗?

    灵感来自这个答案 https stackoverflow com a 52355930 7151494 我尝试复制并粘贴 并在中添加测试main 这段代码 template