使用C ++ 14中的泛型lambda函数进行递归

时间:2017-07-09 20:10:18

标签: c++ recursion lambda c++14 auto

我遇到了this问题,其中answer描述了有关如何使用通用lambda函数替换std::function technique以及如何重新连接停止条件以启用退货类型扣除。

基于以上所述,我创建了以下工作示例:

#include <cstdio>

void printSeq(unsigned start) {
    auto recursion = [](auto&& self, const char* format, unsigned current) {
        printf(format, current);
        if(!current)
            return static_cast<void>(printf("\n"));
        else
            self(self, ", %u", current - 1);
    };

    recursion(recursion, "%u", start);
}

int main() {
    return (printSeq(15), 0);
}

我的问题是,在这种情况下使用auto&&优于auto&的优势是什么?我应该在这里使用std::move吗?

1 个答案:

答案 0 :(得分:3)

auto&只是左值。

这很重要,直到您使用临时代理备忘录重构和替换左值递归对象,例如。

auto&&是无害的,意思是“我不介意这是一个临时或其他什么,只是不要复制”,这在这里表达了意义。 auto&声明“不允许临时!”有时你想在制作参考时排除临时,但很少见。

auto const&autoauto&&应该是你的面包和黄油。

如果您的操作明确是关于编写,那么只使用auto&您可以排除代理参考。