【问题标题】:Can I std::forward the arguments in fold expression?我可以 std::forward 折叠表达式中的参数吗?
【发布时间】:2019-10-30 09:44:19
【问题描述】:

在 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。

我可以转发折叠表达式中的参数吗?还是我们根本不需要它?

这可能是一个愚蠢的初学者问题,但我仍然无法在网上找到答案。

【问题讨论】:

    标签: c++ c++11 c++17 fold-expression


    【解决方案1】:

    我可以转发折叠表达式中的参数吗?

    是的

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

    重点不是折叠。

    关键是你如何接受一个论点。

    如果你收到它作为价值

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

    你不能转发它(但你可以移动它)

    如果你想转发它,你必须接收它作为转发参考,即模板类型和&amp;&amp;

    template<typename ... Args>
    void print(Args && ... args) // <-- forwarding reference
    

    【讨论】:

    • 感谢您的回答。我不知道这一点。一段时间后我会检查答案(只是看看是否有人必须告诉更多关于它的事情)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多