C++ Can';t使decltype说明符在lambda函数中正常工作
这段代码不完整。编译器提醒我:无法从“初始值设定项列表”转换为“C++ Can';t使decltype说明符在lambda函数中正常工作,c++,c++11,lambda,grammar,decltype,C++,C++11,Lambda,Grammar,Decltype,这段代码不完整。编译器提醒我:无法从“初始值设定项列表”转换为“std::priority\u queue&” #include <vector> #include <queue> int main() { using namespace std; priority_queue<int> que; auto func = [&]() {
std::priority\u queue&
”
#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;
}
#包括
#包括
int main()
{
使用名称空间std;
优先权;
自动函数=[&]()
{
向量向量机;
que=decltype(que)(vec.begin(),vec.end());
//无法从“初始值设定项列表”转换为“std::priority\u队列&”
};
func();
返回0;
}
如果我将priority_队列声明移动到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;
}
#包括
#包括
int main()
{
使用名称空间std;
自动函数=[&]()
{
优先权;
向量向量机;
que=decltype(que)(vec.begin(),vec.end());
};
func();
返回0;
}
我的编译器是vs2015社区。这看起来像个bug。由于某种原因,
decltype(que)
计算结果为std::priority\u queue&
而不是std::priority\u queue
,这会导致错误。这可能与que
作为引用从lambda捕获列表中传递有关
您还可以创建一个可变lambda:
auto func = [que]() mutable
{
vector<int> vec;
que = decltype(que)(vec.begin(), vec.end());
};
auto func=[que]()可变
{
向量向量机;
que=decltype(que)(vec.begin(),vec.end());
};
这看起来像个bug。由于某种原因,decltype(que)
计算结果为std::priority\u queue&
而不是std::priority\u queue
,这会导致错误。这可能与que
作为引用从lambda捕获列表中传递有关
您还可以创建一个可变lambda:
auto func = [que]() mutable
{
vector<int> vec;
que = decltype(que)(vec.begin(), vec.end());
};
auto func=[que]()可变
{
向量向量机;
que=decltype(que)(vec.begin(),vec.end());
};
这似乎是MSVC特定的编译器错误。不允许分配,因为que
是优先级队列&
,请使用std::remove\u 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;
}
#包括
#包括
int main()
{
使用名称空间std;
优先权;
自动函数=[&]()
{
向量向量机;
que=std::remove_reference::type(vec.begin(),vec.end());
};
func();
返回0;
}
这似乎是MSVC特定的编译器错误。不允许分配,因为que
是优先级队列&
,请使用std::remove\u 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;
}
#包括
#包括
int main()
{
使用名称空间std;
优先权;
自动函数=[&]()
{
向量向量机;
que=std::remove_reference::type(vec.begin(),vec.end());
};
func();
返回0;
}
您使用的是哪种编译器?没有错误,也没有警告。@kennytm vs2015社区..使用gcc 6.1.1编译时没有错误。我看不出所显示的代码有任何错误。您使用的是哪种编译器?没有错误,也没有警告。@kennytm vs2015社区..使用gcc 6.1.1编译时没有错误。我看不出显示的代码有什么问题。