c – 可变参数模板参数包转发中的语法差异
作者:互联网
在使用可变参数模板时,我遇到了两种不同的方式来编写对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