2017-04-10 106 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語句,則從該語句中推導出的返回類型可用於該函數的其餘部分,包括其他返回語句。

相關問題