2017-04-10 138 views
0

这是我mergeSort方法内部的代码,为什么我不能在递归lambda函数中使用auto?

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

但相反的编译器抱怨说:

变量“mergeSortRange”与“自动”声明不能出现在其 自己的初始化。

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

+1

它是如何“不起作用”? – NathanOliver

+4

,因为变量“mergeSortRange”仅在语句结尾处获得其类型,并且您正试图在使用它之前使用它 – RiaD

+0

什么是“类型”?它与返回类型不同吗? –

回答

-1

你的程序是形成不良的,因为作为里亚德说,你想调用的函数的类型推断之前:

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

相关问题