2016-08-27 7 views
1

このコードはコンパイルされません。コンパイラは「イニシャライザリスト」から「std::priority_queue<int, std::vector<_Ty, std::allocator<_Ty>>, std::less<_Ty>> &」に変換できません。ラムダ関数内でdecltype指定子を正しく動作させることはできません

priority_queue宣言をラムダ関数に移動すると、完全にコンパイルされます。

#include <vector> 
#include <queue> 

int main() 
{ 
    using namespace std; 
    auto func = [&]() 
    { 
     priority_queue<int> que; 
     vector<int> vec; 
     que = decltype(que)(vec.begin(),vec.end()); 
    }; 
    func(); 
    return 0; 
} 

コンパイラはvs2015コミュニティです。

+1

queはそれを修正するためにstd::remove_referenceを使用し、priority_queue<int>&であるため、割り当てが許可されていませんか? clangでのエラーや警告はありません。 – kennytm

+0

@kennytm vs2015コミュニティ。 – iouvxz

+1

[ideoneでうまくいく](https://ideone.com/Wm6hJX)。 –

答えて

1

これはバグのようです。何らかの理由でdecltype(que)std::priority_queue<int>の代わりにstd::priority_queue<int>&と評価され、エラーが発生します。これは、queがラムダキャプチャリスト内の参照として渡されるという事実に関連している可能性があります。

auto func = [que]() mutable 
{ 
    vector<int> vec; 
    que = decltype(que)(vec.begin(), vec.end()); 
}; 
4

これはMSVC特定のコンパイラエラーと表示されます。

また、可変ラムダを作ることができます。あなたが使用しているコンパイラ

#include <vector> 
#include <queue> 

int main() 
{ 
    using namespace std; 
    priority_queue<int> que; 
    auto func = [&]() 
    { 
     vector<int> vec; 
     que = std::remove_reference<decltype(que)>::type(vec.begin(),vec.end()); 
    }; 
    func(); 
    return 0; 
}