这段代码没有编译。编译器提醒我:无法从“初始化列表”转换为“std::priority_queue<int, std::vector<_Ty, std::allocator<_Ty>>, std::less<_Ty>> &
”。
#include <vector>
#include <queue>
int main()
{
using namespace std;
priority_queue<int> que;
auto func = [&]()
{
vector<int> vec;
que = decltype(que)(vec.begin(),vec.end());
//cannot convert from“initializer list”to“std::priority_queue<int, std::vector<_Ty, std::allocator<_Ty>>, std::less<_Ty>> &”
};
func();
return 0;
}
如果我将priority_queue声明移动到lambda函数中,它将完美编译。
#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社区。 p>
答案 0 :(得分:4)
这似乎是MSVC特定的编译器错误。不允许分配,因为que
是priority_queue<int>&
,请使用std::remove_reference
来修复它:
#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;
}
答案 1 :(得分:1)
这看起来像个错误。出于某种原因,decltype(que)
评估为std::priority_queue<int>&
而不是std::priority_queue<int>
,这会导致错误。这可能与que
从lambda捕获列表中作为引用传递的事实有关。
你也可以制作一个可变的lambda:
auto func = [que]() mutable
{
vector<int> vec;
que = decltype(que)(vec.begin(), vec.end());
};