无法使decltype说明符在lambda函数内正常工作

时间:2016-08-27 16:19:16

标签: c++ c++11 lambda grammar decltype

这段代码没有编译。编译器提醒我:无法从“初始化列表”转换为“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社区。

2 个答案:

答案 0 :(得分:4)

这似乎是MSVC特定的编译器错误。不允许分配,因为quepriority_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());
};