无法使 decltype 说明符在 lambda 函数内正常工作
Can't make the decltype specifier work properly inside the lambda function
这段代码不符合。编译器提醒我:无法从“初始化列表”转换为“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社区
这看起来像是一个错误。由于某种原因,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());
};
这似乎是 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;
}
这段代码不符合。编译器提醒我:无法从“初始化列表”转换为“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社区
这看起来像是一个错误。由于某种原因,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());
};
这似乎是 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;
}