我正在尝试编写一个函数来返回带有自定义比较器的
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 << " ";
}
它工作正常。上面的内容有什么问题吗,还是微软比较迂腐,或者是某种编译器错误?
我没有关于出了什么问题的答案(无论是 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(可能还有更早版本)中的一个错误。