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

时间:2017-04-10 13:55:59

标签: c++ recursion lambda

这是我的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,我希望它能正常工作(原谅我的无知)。

但是编译器抱怨说:

  

变量&#39; mergeSortRange&#39;用&#39; auto&#39;声明不能出现在它的   拥有初始化程序。

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

1 个答案:

答案 0 :(得分:-1)

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

  

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