“……”标记是什么意思?即参数包上的双省略号运算符

2023-11-24

在浏览 gcc 当前对新 C++11 标头的实现时,我偶然发现了“......”标记。您可以检查以下代码编译良好[来自 godbolt.org]。

template <typename T>
struct X
{ /* ... */ };

template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };

那么,这个token有什么意义呢?

编辑:看起来问题标题中的“......”被修剪为“......”,我真正的意思是“......”。 :)


这种奇怪现象的每个实例都与常规单个省略号的情况配对。

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
    { typedef _Res result_type; };

我的猜测是双省略号的含义类似于_ArgTypes..., ...,即可变参数模板扩展,后跟 C 样式可变参数列表。

这是一个测试支持这个理论……我认为我们有一个新的最差伪运算符的获胜者。

Edit:这看起来确实是符合的。 §8.3.5/3 描述了一种形成参数列表的方法:

parameter-declaration-listopt ...opt

因此,双省略号是由以参数包结尾的参数声明列表,后跟另一个省略号形成的。

逗号纯粹是可选的; §8.3.5/4确实说

在语法正确且“...”不是抽象声明符的一部分的情况下,“, ...”与“...”同义。

This is在抽象声明符中,[edit]但 Johannes 提出了一个很好的观点,即他们指的是参数声明中的抽象声明符。我想知道为什么他们没有说“参数声明的一部分”,以及为什么这句话不仅仅是一个信息注释......

此外,va_begin() in <cstdarg>在可变参数列表之前需要一个参数,所以原型f(...)C++特别允许的没有用。与 C99 交叉引用,它在普通 C 中是非法的。所以,这是最奇怪的。

使用说明

按要求,这是一个演示双省略号的:

#include <cstdio>
#include <string>

template< typename T >
T const &printf_helper( T const &x )
    { return x; }

char const *printf_helper( std::string const &x )
    { return x.c_str(); }

template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
    return fn( printf_helper( args ) ... );
}

int main() {
    wrap_printf( &std::printf, "Hello %s\n", std::string( "world!" ) );
    wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“……”标记是什么意思?即参数包上的双省略号运算符 的相关文章

  • ListView 内的 TextBox 绑定到对象,双向绑定不起作用

    Edit 好吧 在尝试了无数次但没有成功之后 我创建了一个非常小的 Wpf 应用程序 您可以直接复制此代码 请注意 当您更改文本框中的值并按 测试 按钮时 这些值永远不会更新 我不明白为什么双向绑定不起作用 请帮忙 这是 xaml
  • 隐式转换为“System.IDisposable”错误

    这就是我想做的 private KinectAudioSource CreateAudioSource var source KinectSensor KinectSensors 0 AudioSource source NoiseSupp
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举
  • 如何管理 JSONP 响应中的 ' ?

    我需要像这样管理 char 在我的 JSONP 请求中 通过 jquery 使用 Ajax 所以 来自 C 这就是我所做的 myText Hello I m a string myText Replace Response Write Re
  • 分段错误(核心转储)

    当我尝试运行此程序时 出现分段错误 核心转储 它编译完美 但我收到错误 我不知道为什么 我已尝试以所有可能的方式编辑我的代码 但仍然收到此错误 我已经没有主意了 任何帮助都会很棒 谢谢 unsigned short reg NULL int
  • 空别名共享指针是否是无操作删除共享指针的良好替代方案?

    有时我需要shared ptr具有无操作删除器的实例 因为 API 期望shared ptr例如 它想要存储有限的时间 但我得到了一个原始指针 不允许我拥有比我运行的时间更长的时间 对于这种情况 我一直使用无操作删除器 例如 const v
  • 复制空对象是否涉及访问它

    灵感来自this https stackoverflow com a 48273386 4832499问题 struct E E e E f e Accesses e To access https timsong cpp github i
  • cmake:如何在只有 target_link_directories (没有 target_link_libraries)的共享库中设置 rpath?

    我的项目的目标如下 从我的主可执行文件中 我想加载一个库 libfoo so 加载第二个库 libbar so 我不想在任何路径中指定相对或绝对路径filename我传递给的参数dlopen 即我希望我的代码读取 dlopen libfoo
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • UWP 导航 (Template10)、枢轴控制、多帧

    我正在尝试在我的 UWP 应用程序中实现以下导航样式 使用 Template10 但正在努力如何使用多个帧作为独立的历史堆栈 在枢轴的每个框架内 我希望有一个独立的框架 它有自己的历史记录和后堆栈 只能通过枢轴在框架之间导航 我正在考虑使用
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • Microsoft.Graph GetAsync() 无限期挂起

    介绍 我正在开发一个 ASP NET 应用程序 除其他外 它应该从 Azure Active Directory 检索用户 为此 我使用 Microsoft Graph 版本 1 14 0 预览库 可以找到该库here https www
  • 如何在C++中从Imagemagick图像获取缓冲区

    我正在使用 ImageMagick 库进行图像处理 我需要加载 bmp 图像 将其转换为 jpeg 将其加载到缓冲区中并通过网络发送 但是 我在 ImageMagick 中找不到任何可以在缓冲区中转换和存储数据的支持函数 我只能写入文件 尝
  • 使用 X509 证书对多个收件人进行 XML 加密和解密

    我已经成功地使用 MSDN 上的示例来加密和解密 xml 文档 http msdn microsoft com en us library ms229744 aspx http msdn microsoft com en us librar
  • 如何在单击按钮时关闭 .exe 应用程序

    谁能告诉我如何使用 C 在单击按钮时关闭 exe 文件 我知道如何使用 C 在单击按钮时运行 exe 文件 如下所示 string str C windows system32 notepad exe process StartInfo F
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 将 HTML 渲染为图像

    我正在基于动态输入和裁剪图像生成优惠券 并且现在使用 ntml 和 css 显示优惠券 问题是 打印这已成为一个问题 因为打印时背景如何消失以及其他问题 所以我认为最好的解决方案是能够基于html生成图像 或者设置某种接受字符串和图像的模板
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格
  • 将 byte[] 作为文件打开,而不先将其实际保存为文件

    打开以 byte 形式存储在数据库中的 Word 文件的最佳方法是什么 我必须将一些文档存储在 Access 数据库中 Word 文件 2003 及更高版本 并存储在严格通过 CD 运行的应用程序上 不幸的是 它们必须位于数据库中 并且不能
  • C 中的隐式类型转换

    我在维基百科上偶然发现了以下示例 http en wikipedia org wiki Type conversion Implicit type conversion http en wikipedia org wiki Type con

随机推荐

  • 页面的官方 Facebook RSS 提要

    许多人已经描述了如何获取 Facebook 页面的 RSS 数据源 例如 http ahrengot com tutorials facebook rss feed 以下 URL 提供了可口可乐页面的 feed 但是 我似乎无法在 face
  • 在 Web 应用程序之间共享 ASP.NET 资源文件

    我有多个项目需要共享资源文件 resx 已提出将资源文件移动到单独的程序集并让 Web 项目引用它的建议 有如何执行此操作的示例吗 我是否创建一个新的类库项目并将 App GlobalResource 文件夹移到其中 我认为这不会起作用 因
  • 如何使用自然的entrySet()顺序迭代HashMap?

    我的地图包含按字母顺序排序的键 当我显示它时 我使用的是entrySet iterator 但我的结果不是按字母顺序排列的 我如何才能按顺序获得结果 不 您的地图不按字母顺序保存元素 你可能有 put 然后按该顺序 但映射没有定义的迭代顺序
  • 您的 Android App Bundle 使用错误的密钥进行签名。确保您的应用程序包使用正确的签名密钥进行签名,然后重试

    如何使用正确的签名密钥对我的 Android 应用程序包进行签名 我为这个问题把头撞在桌子上大约两个小时 当我最终放弃并填写 重置密钥 请求时 我意识到我当前正在尝试将其上传到错误的项目一直以来 因此 第一步 确认您正在尝试上传到正确的项目
  • 流式 HTTP 响应,刷新到浏览器

    我有如下的观点 from django views decorators http import condition def stream for i in range 0 40 yield 1024 yield d i time slee
  • 贫血领域模型:优点/缺点

    我想知道使用贫血域模型的优点和缺点 请参阅下面的链接 福勒文章 由于 贫血领域模型 是反模式 为什么有这么多系统实现它 我认为有几个原因 1 系统的复杂性 在一个简单的系统中 几乎是您在互联网上找到的所有示例和示例代码 如果我想实现 将产品
  • 如何在单击某些按钮时重新加载我的 UIViewController?

    我正在开发一个 iPhone 应用程序 我有一个UIViewController类中存在一些封面流动画 根据设计 我的视图顶部有一些 5 个按钮 每个按钮都有一个IBAction单击按钮的方法我需要显示具有不同数据的不同组的封面流 并且封面
  • 在 Perl 正则表达式中嵌入评估

    所以我正在编写一个快速的 Perl 脚本 它清理一些 HTML 代码并通过 html gt pdf 程序运行它 我希望丢失尽可能少的信息 因此我想扩展文本区域以适应其中当前的所有文本 在我的例子中 这意味着根据文本框中字符串的值将行数设置为
  • C# 线程安全的StreamWriter 怎么做呢? 2

    所以这是我上一个问题的延续 所以问题是 构建线程安全的程序的最佳方法是什么 因为它需要将双精度值写入文件 如果通过流写入器保存值的函数被多个线程调用 最好的方法是什么 我修改了MSDN上找到的一些代码 下面怎么样 这个正确地将所有内容写入文
  • Django - 限制表单中选择字段的选择

    我在 Django 中的选择字段上遇到问题 我需要一个表格来将订单移动添加到工单中 这些是choices py中的选择 STATUS CHOICES 1 Orden Creada 2 En Tienda Asociada 3 Recibid
  • 如何将序列号列添加到结果数据中? [复制]

    这个问题在这里已经有答案了 可能的重复 向此 T SQL 查询添加行号 我使用的是 sql server 2008 当我输入 从员工中选择 结果是这样的 EmpID EmpName Salary DB1608 David 100000 JT
  • JavaScript .prototype 如何工作?

    我不太热衷于动态编程语言 但我已经编写了相当多的 JavaScript 代码 我从来没有真正了解过这种基于原型的编程 有人知道这是如何工作的吗 var obj new Object obj prototype test function a
  • SQL LIKE 语句的 LINQ 版本

    我是 LINQ 的新手 在网上搜索模仿 SQL 的 LIKE 语句的 LINQ 示例并不能让我满意 我想要的是产生与此 SQL 相同的查询结果 SELECT FROM table 1 WHERE column 1 LIKE 0 我想从 ta
  • Neo4j:MERGE 创建重复节点

    我的数据库模型有用户和 MAC 地址 一个用户可以有多个MAC地址 但一个MAC只能属于一个用户 如果某个用户设置了他的 MAC 并且该 MAC 已经链接到另一个用户 则现有关系将被删除 并在新所有者和该 MAC 之间创建新关系 换句话说
  • 在 Swing 应用程序中使用 Hibernate 进行会话管理

    如何在 Java Desktop Swing 应用程序中进行 Hibernate 会话管理 您使用单个会话吗 多次会议 以下是有关该主题的一些参考资料 http www hibernate org 333 html http blog sc
  • 围绕多个插入或更新使用事务的正确方法

    测试插入 更新失败并回滚此事务 如果有 的正确方法是什么 我认为我所拥有的不起作用 因为我的插入 更新是 3 个单独的语句 并且 ROWCOUNT 将仅反映最后执行的语句 BEGIN TRANSACTION Script GO INSERT
  • php isset() 在 javascript 中等效

    我正在寻找与 php 函数等效的 javascriptisset 我已经尝试过此处描述的方法JavaScript isset 等效项但在 firebug 中 出现错误 data del is undefined Firebug warnin
  • 使用 awk 从 stdin 或文件读取

    到目前为止 这是我的代码 awk a length END for i in a print i a i lt 1 sort n 它从文本文件中读取行的长度 并输出行的长度 然后输出有多少行具有相同的长度 所以输入 hello guys h
  • Passport.js - 隐式将 {user: req.user} 传递给模板?

    现在在多个项目中使用 Passport js 和 Express 我注意到自己一遍又一遍地这样做 即指定 user req user 明确用于我的 Express 路线 有时我忘记传递它 突然之间就像用户甚至不再登录一样 我怎样才能通过us
  • “……”标记是什么意思?即参数包上的双省略号运算符

    在浏览 gcc 当前对新 C 11 标头的实现时 我偶然发现了 标记 您可以检查以下代码编译良好 来自 godbolt org template