Использование лямбда-выражения в качестве сравнения для std :: set, когда оно находится внутри вектора - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу использовать лямбда-выражение в качестве пользовательского сравнения для 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>        ]

Большинство ошибок, которые я до сих пор видел с этим, похоже, связано с копированием набора.

Итак, мой вопрос:

Почему вышеуказанный код не работает и как я могу заставить его работать, все еще используя локально определенную лямбду?

1 Ответ

0 голосов
/ 11 декабря 2018

Это похоже на ошибку в компиляторе MS, поскольку он хорошо компилируется с GCC и Clang.

Чтобы заставить его работать в компиляторе MS (Visual Studio 2017), вы можете сделать это:

std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};

Это компилируется чисто.Смотри здесь .

...