我可以 std::forward 折叠表达式中的参数吗?
Can I std::forward the arguments in fold expression?
在 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
ing。
我可以转发折叠表达式中的参数吗?或者我们根本不需要它?
这可能是一个愚蠢的初学者问题,我仍然无法在网上找到答案。
Can I forward the arguments in fold expression?
是
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
在 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
ing。
我可以转发折叠表达式中的参数吗?或者我们根本不需要它?
这可能是一个愚蠢的初学者问题,我仍然无法在网上找到答案。
Can I forward the arguments in fold expression?
是
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