使用自定义比较器返回 std::set

问题描述 投票:0回答:1

我正在尝试编写一个函数来返回带有自定义比较器的

std::set
(根据此答案的建议),如下所示:

#include <iostream>
#include <set>

auto GetSet()
{
    const auto cmp = [](auto n1, auto n2) { return n1 < n2; };
    std::set<int, decltype(cmp)> mySet(cmp); // compiler error, see below
    mySet.insert(13);
    mySet.insert(31);
    return mySet;
}
int main()
{
    auto mySet = GetSet();
    for (auto i : mySet)
        std::cout << i << " ";
}

显然这是为了演示目的,我的课程比

int

更复杂

它在GCCColiru链接中工作正常,但在VS2019中不起作用。在 VS2019 中(使用

/std:c++17
)它会产生以下错误:

错误 C2783 'void std::swap(_Ty &,_Ty &) noexcept()':无法推导出 '_Enabled' C:\Program Files (x86)\Microsoft Visual Studio�9\Professional\VC\Tools 的模板参数\MSVC .27.29110\包括\实用程序 114

如果我将代码更改为不使用该功能,而是使用:

int main()
{
    const auto cmp = [](auto n1, auto n2) { return n1 < n2; };
    std::set<int, decltype(cmp)> mySet(cmp);
    mySet.insert(13);
    mySet.insert(31);
    for (auto i : mySet)
        std::cout << i << " ";
}

它工作正常。上面的内容有什么问题吗,还是微软比较迂腐,或者是某种编译器错误?

c++ visual-studio-2019
1个回答
0
投票

我没有关于出了什么问题的答案(无论是 GCC 比较草率还是 MSVC 比较迂腐),但你可以使用以下内容来代替:

#include <set>
#include <functional>
auto GetSet()
{
    const auto cmp = [](auto n1, auto n2) { return n1 < n2; };
    std::set<int, std::function<bool(int, int)>> mySet(cmp);
    mySet.insert(13);
    mySet.insert(31);
    return mySet;
}

这适用于两种编译器。

有趣的是,这在 VS22 中有效,所以我猜测这只是 VS19(可能还有更早版本)中的一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.