我想使用lambda表达式作为std::整数集的自定义Compare。例如,这个网站上有很多解释如何做到这一点的答案https://stackoverflow.com/a/46128321/10774939.事实上,
#include <vector>
#include <set>
#include <iostream>
int main() {
auto different_cmp = [](int i, int j) -> bool {
return j < i;
};
std::set<int, decltype(different_cmp)> integers(different_cmp);
integers.insert(3);
integers.insert(4);
integers.insert(1);
for (int integer : integers) {
std::cout << integer << " ";
}
return 0;
}
编译并输出
4 3 1
如预期。然而,当我试图用把这个集合放在一个向量中时
std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers;
vec_of_integers.push_back(integers);
编译器抱怨。我使用的是Visual Studio 2017,根据周围的代码,我会遇到不同的编译器错误。在上面的例子中,它是
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includeutility(77): error C2664: 'void std::swap(std::exception_ptr &,std::exception_ptr &) noexcept': cannot convert argument 1 from '_Ty' to 'std::exception_ptr &'
1> with
1> [
1> _Ty=main::<lambda_48847b4f831139ed92f5310c6e06eea1>
1> ]
到目前为止,我看到的大多数错误似乎都与复制集有关。
所以我的问题是:
为什么上面的代码不起作用,我如何在使用本地定义的lambda的同时使它起作用?
这似乎是MS编译器中的一个错误,因为它可以很好地与GCC和Clang一起编译。
要使其在MS编译器(Visual Studio 2017(中运行,您可以执行以下操作:
std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};
这编译得很干净。请参见此处。