![](/img/trans.png)
[英]Fold expression: Replacing specific type but forwarding all others, how to correctly specialise `std::forward`?
[英]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.