首页 > 解决方案 > 非右值引用的可变参数的 C++ 转发

问题描述

考虑:

template <typename... Args>
void foo(Args... args) {
    bar(std::forward<Args>(args)...);
}

template <typename... Args>
void foo2(Args&&... args) {
    bar(std::forward<Args>(args)...);
}

我理解在 的情况下完美的右值引用转发foo2,但是转发 的可变参数值的目的是foo什么?

如果foo看起来像这样,会有什么不同?

template <typename... Args>
void foo(Args... args) {
    bar(args...);
}

标签: c++variadic-templatesperfect-forwarding

解决方案


这不是一回事。

在这个

template <typename... Args>
void foo(Args... args) {
    bar(std::forward<Args>(args)...);
}

这两件事加起来就是static_cast<Args&&>(args)...有一个右值引用返回类型,即返回一个右值(因为Args不是一个引用,所以在和之间不会发生引用折叠Args&&给出一个左值引用返回类型,这意味着一个左值返回值)。

所以不,在您的第一个版本中没有完美的转发foo。其中std::forwardin 它无条件地将其参数转换为右值;这通常是std::move的工作:

// this is equivalent to the code above
template <typename... Args>
void foo(Args... args) {
    bar(std::move(args)...);
}

推荐阅读