Я хочу использовать лямбда-выражение в качестве пользовательского сравнения для std :: набора целых чисел.На этом сайте есть много ответов, объясняющих, как это сделать, например 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 studio\2017\community\vc\tools\msvc\14.16.27023\include\utility(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> ]
Большинство ошибок, которые я до сих пор видел с этим, похоже, связано с копированием набора.
Итак, мой вопрос:
Почему вышеуказанный код не работает и как я могу заставить его работать, все еще используя локально определенную лямбду?