ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 可变参数模板参数包转发中的语法差异

2019-08-23 23:05:52  阅读:128  来源: 互联网

标签:perfect-forwarding c c11 variadic-templates


在使用可变参数模板时,我遇到了两种不同的方式来编写对std :: forward的调用,但是我想知道两种语法之间的实际区别是什么?

template<typename... T>
void one(T&&... args)
{
    foo(std::forward<T&&...>(args...));
}
template<typename... T>
void two(T&&... args)
{
    foo(std::forward<T&&>(args)...);
}

根据我的编译器,这些都是有效的语法,并且在大多数情况下编译器不会抱怨.但是我发现了一些情况,其中一个或另一个是正确的,但编译器没有详细说明原因.

另一个更正确吗?
它们用于不同的目的吗?

解决方法:

…放置告诉编译器在哪里扩展包,对于它之前的东西中的每个元素一次(很难轻易地说,但我将在下面说明).

让我们考虑一个包T = {int,double,char}和args = {1,2.0,’3′}

你的第一个例子(一个)将扩展<>内的T然后args在()内部变成了

foo(std::forward<T&&...>(args...));  // becomes:
foo(std::forward<int&&, double&&, char&&>(1, 2.0, '3'));

这不是std :: forward的工作原理,因为它只需要一个参数.你的第二个例子(两个)说要为包中的每个项目扩展一次std :: forward的整个调用,所以它就变成了

foo(std::forward<T&&>(args)...);  // becomes:
foo(std::forward<int&&>(1), std::forward<double&&>(2.0),std::forward<char&&>('3'));

至于为什么这两个编译都很好,如果你只用一个参数调用,结果是相同的.如果你根本没有调用它那么它就不会被实例化.

标签:perfect-forwarding,c,c11,variadic-templates
来源: https://codeday.me/bug/20190823/1702140.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有