【发布时间】:2017-04-25 13:37:11
【问题描述】:
在使用可变参数模板时,我遇到了两种不同的方式来编写对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)...);
}
根据我的编译器,这些都是有效的语法,并且在大多数情况下编译器不会抱怨。但是我发现了一些情况,其中一个或另一个是正确的,但编译器没有详细说明原因。
一个比另一个更正确吗?
它们有不同的用途吗?
【问题讨论】:
-
第一个是错误的,除了单元素包外实际上并没有编译。
-
这就是所谓的包扩展。使用
one(2, 2.3, 2.3f);调用第一个示例将使函数体foo(std::forward<int&&, double&&, float&&>(2, 2.3, 2.3f)无法编译。
标签: c++ c++11 variadic-templates perfect-forwarding