为什么我不能在递归 lambda 函数中使用 auto

Why can I not use auto in a recursive lambda function?

本文关键字:auto 函数 lambda 不能 递归 为什么      更新时间:2023-10-16

这是我mergeSort方法中的代码,

    std::function<void(std::vector<T>*)> mergeSortRange = [&](std::vector<T>* array) -> void {
        int length = (int) array->size();
        if (length < 2)
            return;
        std::vector<T>* leftArr = new std::vector<T>(array->begin(), array->begin() + length / 2);
        std::vector<T>* rightArr = new std::vector<T>(array->begin() + length / 2, array->end());
        mergeSortRange(leftArr);
        mergeSortRange(rightArr);
        mergeTwoSortedArrrays(leftArr, rightArr, array);
        delete leftArr;
        delete rightArr;
    };

我本可以将第一行替换为:

auto mergeSortRange = [&](std::vector<T>* array) -> void,我希望它能正常工作(请原谅我的无知(。

但相反,编译器抱怨说:

用"auto"声明的变量"mergeSortRange"不能出现在其 自己的初始值设定项。

我已经指定了参数和返回类型。有人可以对此有所了解吗?

你的程序格式不正确,因为正如Riad所说,你试图在推导类型之前调用函数:

dcl.spec.auto/10 如果需要具有未推断占位符类型的实体的类型来确定表达式的类型,则程序格式不正确。但是,一旦在函数中看到未丢弃的返回语句,从该语句推导出的返回类型就可以用于函数的其余部分,包括其他返回语句。