Могу ли я std :: пересылать аргументы в сложенном выражении? - PullRequest
1 голос
/ 30 октября 2019

В 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 аргументов, когда использовалось выражение сгиба.

Могу ли я переслать аргументы в выражении сгиба? Или нам это вообще не нужно?

Возможно, это глупый вопрос для новичка, но я не могу найти ответ в Интернете.

1 Ответ

3 голосов
/ 30 октября 2019

Можно ли переслать аргументы в выражении сгиба?

Да

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
...