2015-04-02 33 views
0

我覺得這個問題很愚蠢,但我真的很想知道在我未來的代碼中嚴重「鍵入兩次」之前的原因。C++ 11爲什麼需要爲priority_queue構造比較兩次信息

例如,我從myVector(代碼之前所定義的向量)構建絕對最大priority_queue:

auto comp = [](int a, int b) { return abs(a) < abs(b); }; 
priority_queue<int, vector<int>, decltype(comp)> pq(comp, myVector); 

排版拉姆達需要填寫模板(我同意,因爲這個priority_queue實例將在其生命中具有該訂單屬性),並且還需要在構造函數中(這使我感到困惑)。

爲什麼構造函數不能從模板中的訂單信息中推導出訂單?

+0

由於lambdas不是默認可構造的。 – 2015-04-02 18:42:12

+0

@ T.C。你能否詳細說明你的評論? – 8090PZ 2015-04-02 19:35:29

+0

可能的重複[模板類型演繹在C + +類或功能?](http://stackoverflow.com/questions/1921817/template-type-deduction-in-c-for-class-vs-function) – quamrana 2015-04-02 19:48:39

回答

1

C++語言規定lambda具有刪除默認構造函數,這意味着lambda不能被默認構造。因此,這樣的代碼不會編譯:

auto f1 = [](int i){return i;}; 
decltype(f1) f2; // ERROR: try to default-construct a lambda object "f2" 

下面給出priority_queue的實現細節:

template< 
    typename _ElemTy, 
    typename _Container = vector<_ElemTy>, 
    typename _Pred = less<typename _Container::value_type> 
    > 
    class priority_queue 
    { 
     priority_queue() 
     : c(), comp() // use empty container, DEFAULT comparator 
     { 
     } 

     priority_queue(const _Pred& p, const _Container& c) 
      : cont(c), comp(p) 
     { 
      make_heap(cont.begin(), cont.end(), comp); 
     } 

     ..... 

如果它的默認構造函數是用來和類型_Pred是拉姆達表達式comp()必須引起編譯錯誤。因此你必須使用上面的第二個構造函數,它需要一個明確提供的lambda對象。

相關問題