2

在 C++11 中,我们有可变参数模板,在其中我们可以std::forward像下面的代码一样使用参数

#include <utility>
#include <iostream>
#include <string>

void printVariadic()
{}
template<typename T, typename... Args>
void printVariadic(T&& arg, Args&&... args)
{
   std::cout << arg << "\n";
   printVariadic(std::forward<Args>(args)...); // here we forward the arguments
}

但是,在 C++17 中,我们有折叠表达式(据我了解,它直到最后一个参数才进行递归函数调用)。

template<typename ... Args>
void print(Args ... args)
{
    ((cout << args << "\n"), ...); // did we here miss the part of `std::forward`?
}

在在线示例中,当使用折叠表达式时,我看不到std::forward参数。

我可以在折叠表达式中转发参数吗?还是我们根本不需要它?

这可能是一个愚蠢的初学者问题,但我仍然无法在网上找到答案。

4

1 回答 1

3

我可以在折叠表达式中转发参数吗?

是的

template<typename ... Args>
void print(Args && ... args)
{ // ...........^^
    ((cout << std::forward<Args>(args) << "\n"), ...);
}

重点不是折叠。

关键是你如何接受一个论点。

如果您收到它作为价值

void print(Args ... args) // <-- by value

你不能转发它(但你可以移动它)

如果要转发它,则必须将其作为转发参考接收,即带有模板类型和&&

template<typename ... Args>
void print(Args && ... args) // <-- forwarding reference
于 2019-10-30T09:47:33.610 回答