簡體   English   中英

我可以 std::forward 折疊表達式中的 arguments 嗎?

[英]Can I std::forward the arguments in fold expression?

在 C++11 我們有可變參數模板,我們可以在其中std::forward arguments 就像下面的代碼

#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 中,我們有折疊表達式(據我了解,直到最后一個參數,它才會進行遞歸 function 調用)。

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

在在線示例中,當使用折疊表達式時,我看不到 arguments 的std::forward

我可以在折疊表達式中轉發 arguments 嗎? 還是我們根本不需要它?

這可能是一個愚蠢的初學者問題,但我仍然無法在網上找到答案。

我可以在折疊表達式中轉發 arguments 嗎?

是的

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM