Я хочу использовать лямбда-выражение как пользовательское сравнение для набора целых чисел 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> ]
Большинство ошибок, которые я видел до сих пор, похоже, связаны с копированием набора.
Итак, мой вопрос:
Why does the above code not work and how can I make it work, while still using a locally defined lambda?
Репродукция: godbolt.org/z/SgVU58
На самом деле это всего лишь приведенный выше код плюс две строки std :: vector <std :: set <int, decltype (different_cmp) >> vec_of_integers; vec_of_integers.push_back (целые числа); вставлен прямо перед возвратом 0. Как уже ответили другие, похоже, что это ошибка, специфичная для MS-компилятора.





Это похоже на ошибку в компиляторе MS, поскольку он хорошо компилируется с GCC и Clang.
Чтобы он работал в MS Compiler (Visual Studio 2017), вы можете сделать это:
std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};
Это компилируется чисто. См. здесь.
Ааа, опять же, MS-компилятор, почему !?
@ x432ph: Ага. Сам сегодня я столкнулся с тремя вопросами, связанными с ошибками компилятора MS.
В реальном коде, который я пытаюсь отлаживать, мне нужно создать вектор переменной длины. Есть ли способ сделать это, не вызывая ошибки?
@ x432ph: Может, стоит попробовать комбинацию resize и vector.at(index) = x.
Хорошая идея, но теперь ошибка возникает в других местах, где я пытаюсь изменить наборы уже в векторе. К сожалению, я полагаю, что мне нужно создать собственную реализацию дерева поиска, чтобы оно надежно работало для моих целей.
Я не могу воспроизвести вашу ошибку. Пожалуйста, предоставьте полный пример, который мы можем скопировать и вставить в наш компилятор.