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编译时没有错误。我看不出显示的代码有什么问题。