Clang 和二进制折叠表达式 — 空参数包的诅咒

2024-04-14

具体来说,Clang 3.6.0,目前由 Coliru 托管。

所有这些片段都是从以下位置调用的:

int main() {
    foo();
    std::cout << "\n----\n";
    foo(1, 2, 3);
}

以下代码:

template <class... Args>
void foo(Args... args) {
    std::cout << ... << args;
}

触发以下编译错误:

main.cpp:7:17: error: expected ';' after expression
    std::cout << ... << args;
                ^
                ;
main.cpp:7:15: error: expected expression
    std::cout << ... << args;
              ^

所以我尝试在表达式两边加上括号:

(std::cout << ... << args);

它有效,但会触发警告:

main.cpp:7:6: warning: expression result unused [-Wunused-value]
    (std::cout << ... << args);
     ^~~~~~~~~
main.cpp:11:5: note: in instantiation of function template specialization 'foo<>' requested here
    foo();
    ^

所以我尝试用函数风格的强制转换来丢弃表达式的值void :

void(std::cout << ... << args);

But :

main.cpp:7:20: error: expected ')'
    void(std::cout << ... << args);
                   ^
main.cpp:7:9: note: to match this '('
    void(std::cout << ... << args);
        ^

我尝试了一个static_cast也是为了同样的结果。

所以我尝试用 C-cast 代替:

(void)(std::cout << ... << args);

但是之后 :

main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
                 ^

...我的输出只是---- : foo(1, 2, 3);不再输出了!

Clang 是否受到未来标准中的邪恶力量的诅咒,它是否有错误,或者问题就在我的椅子上?


转换为时需要一组额外的括号void使用函数符号强制转换,否则括号将被视为强制转换表达式的一部分,而不是折叠表达式。这折叠表达式语法 http://en.cppreference.com/w/cpp/language/fold本身需要一组括号。

以下所有操作均不会产生任何警告:

void((std::cout << ... << args));
(void)((std::cout << ... << args));

或者只是打电话给一些人ostream成员函数以避免未使用结果警告

(std::cout << ... << args).flush();

作为 T.C.在下面的评论中提到,行为(void)(std::cout << ... << args);看起来像一个铿锵的错误。强制转换表示法的语法在中指定5.4 [表达式.cast]

强制转换表达式:
  一元表达式
  ( type-id ) 强制转换表达式

由于强制转换表达式中不需要括号,因此该用法不应产生警告,更重要的是,它应该导致打印参数。

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

Clang 和二进制折叠表达式 — 空参数包的诅咒 的相关文章

  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • Microsoft Graph API 授权错误:无效受众

    我知道这是一个很长的问题 但如果有人能与我分享他们的想法或经验 我真的很感激 因为我已经解决这个问题几天了 现在正在尝试很多事情 我有一个 ASP Net Core 3 1 Web API 应用程序和一个 ASP NET Core 3 1
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • 如何更改 GridView 内 ListViewItemPresenter 中的 SelectedBackground

    我在 SubSection 中有一个 Clickable Gridview
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • Windows Phone 8.1 应用程序多语言

    我正在使用 Visual Studio 2015 在 SilverLight 中创建 Windows Phone 应用程序 8 1 我正在用英语和阿拉伯语创建多语言应用程序 为此 我在项目中创建了 Strings 文件夹 其中包含 en U
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • ASP.NET MVC - 路由 - 具有文件扩展名的操作

    有没有办法实现调用URLhttp mywebsite myarea mycontroller myaction xml这基本上是 假 请求文件 但结果将是一个为动态创建的文件提供服务的操作操作 我试过这个 context MapRoute
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • 为什么我能够使用无效的类指针进行函数调用

    在下面的代码片段中 虽然指针未初始化 但调用仍然成功 temp ptr ptr gt func2 是C 语言特性的问题 还是VC 6编译器的作弊 class temp public temp a 9 int func1 return a b

随机推荐

  • 重置 git 设置

    当我尝试下载时this https git01 codeplex com casablancagit repo 我不断得到error RPC failed result 56 HTTP code 200我认为这是因为我弄乱了一些设置 我正在
  • 在iOS中解析连续的JSON流

    我正在努力掌握我正在编写的应用程序的 JSON 技巧 在应用程序端 我有一个 NSInputStream 它通过 CFStreamCreatePairWithSocketToHost 连接到服务器 服务器正在以异步方式为应用程序生成 JSO
  • 如何将对象传递给 Reveal 模态弹出窗口?

    我想在我的 Rails 3 0 3 应用程序中使用 Reveal Modal jQuery 插件 我想要做的是从父对象的索引页创建子对象 现在我有链接将父级的 id 传递给子控制器的 new 方法 然后打开子级的 new html erb
  • 如何在 C# MVC 中从 Google+ 登录迁移到 Google 登录

    我的网站允许用户使用其 Google 帐户注册并登录 我的 C MVC 应用程序使用 Microsoft AspNet Identity Owin 提供的模板功能 我收到了一封来自 Google 的电子邮件 称他们将关闭 Google 该电
  • 在 Eclipse IDE 上使用 VBA [重复]

    这个问题在这里已经有答案了 可能的重复 有没有便宜或免费的 VB6 编程 IDE https stackoverflow com questions 1766514 any cheap or free ides out there for
  • 使用 shell 脚本进行 CGI 编程

    我需要将文本框的内容传递到变量中 即 在 html 页面的文本框中输入的任何内容都需要传递给变量 这是因为我在 linux shell 编程中调用 HTML 以及 CGI 我需要根据需要操纵该变量 你有什么想法去做吗 我需要做的是 我想获取
  • PushSharp 不发送通知

    我有一个简单的代码 PushBroker pushBroker new PushBroker string path HttpContext Current Server MapPath AppSettings CertificatePat
  • 以编程方式将 UITableView 行从一个位置移动/动画化到另一个位置

    我有一个 UITableView 我想以编程方式将一行从位置 N1 移动到位置 N2 并且我希望它能够从旧位置到新位置进行动画处理 我浏览了 UITableView 文档 只看到插入 重新加载和删除 您知道我可以通过编程方式执行此操作的方法
  • Kubernetes Istio 入口网关始终响应 503

    我正在使用 Helm 配置 Istio 在这里你可以找到我的istio config yaml global proxy accessLogFile dev stdout resources requests cpu 10m memory
  • 为什么当参数作为参数传递时 sp_executesql 运行速度变慢

    查询1 快如闪电 sp executesql select from tablesView where Id 1 vs 查询2 太慢 sp executesql select from tablesView where Id Id N Id
  • Chrome 扩展:在 Javascript 中检测新的一天(更改的日期)?

    我知道没有新的一天 或小时 分钟 的事件侦听器 但在我的 Chrome 扩展中 我需要知道新的一天何时开始 这意味着我必须使用 setInterval 函数来找出这一天何时发生变化 但是 我不确定间隔值使用什么 10 秒 还是 10 分钟
  • 如何使用 pandas 将 200.13K 和 1.2M 等数字字符串转换为整数? [复制]

    这个问题在这里已经有答案了 我的 df 中有一个列 Vol 其中的值以 K 和 M 结尾 分别表示数千和数百万 这些值是 dtype 中的 对象 我需要将它们转换为 双精度 Example for the column what I nee
  • Firebase身份验证:如何获取当前用户的密码?

    我是新来的火力地堡身份验证 所以 我正在创建一个带有配置文件的基本应用程序 我做了一个活动来编辑用户的基本信息 例如DisplayName and Email 我不想添加更改密码的功能 但首先 我不想检查当前用户的密码并将其与String从
  • 如何在linux中查找包含字符串的行[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Linux 中有一个文件 我想显示该文件中包含特定字符串的行 该怎么做 通常的方法是使用grep https linux die n
  • Android 4.0 添加日历和事件

    我想在android 4 0及以上版本的设备中添加日历事件 目前我正在使用以下代码添加事件 if android os Build VERSION SDK INT lt 7 Uri calendars Uri parse content c
  • 如何使用摄像头直播作为活动背景?

    我正在尝试制作一个应用程序 其中我需要使用相机实时馈送作为背景 我知道这是一件愚蠢的事情 但无能为力 这是客户的要求 我尝试过使用SurfaceView但到目前为止还没有成功 到目前为止 我在 Stack Overflow 上发现的更多内容
  • 从conda为pip3创建requirements.txt

    我通常使用 conda 来管理我的环境 但现在我正在进行的项目需要比我的笔记本电脑更多的马力 因此 我尝试使用我大学的配备新英特尔至强处理器的工作站 但我没有管理员权限 而且工作站没有 conda 所以我被迫使用 virtualenv 和
  • 公共运算符 new、私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”

    类具有重载运算符new and delete new是公开的 delete是私人的 在构造此类的实例时 出现以下错误 pFoo new Foo bar example cpp 1 错误 C2248 Foo operator delete 无
  • Android IAB 错误 - 需要身份验证

    我在我的应用程序中测试 In App Billing v3 时遇到问题 我无法使用测试帐户购买任何东西 它总是向我显示一个 Play 商店对话框 Error Authentication is required You must log i
  • Clang 和二进制折叠表达式 — 空参数包的诅咒

    具体来说 Clang 3 6 0 目前由 Coliru 托管 所有这些片段都是从以下位置调用的 int main foo std cout lt lt n n foo 1 2 3 以下代码 template