5

In C++11 we have variadic templates, in which we can std::forward the arguments like in the following code

#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
}

But, in C++17 we have fold expression (and from my understanding it doesn't make recurive function call until last argument).

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

In the online examples, I couldn't see a std::forward ing of the arguments, when fold expression has used.

Can I forward the arguments in fold expression? Or don't we need it at all?

It might a dumb beginner qestion, still I couldn't find an answer in online.

LernerCpp
  • 401
  • 1
  • 5
  • 13

1 Answers1

6

Can I forward the arguments in fold expression?

Yes

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

The point isn't folding.

The point is how do you receive an argument.

If you receive it as value

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

you can't forward it (but you can move it)

If you want forward it, you have to receive it as forwarding reference, that is with a template type and a &&

template<typename ... Args>
void print(Args && ... args) // <-- forwarding reference
max66
  • 65,235
  • 10
  • 71
  • 111
  • Thanks for the answer. I wasn't not aware about this. I will chekck as answers after a while(just to see wether anbody has to tell anything more about it). – LernerCpp Oct 30 '19 at 10:05