Оператор лямбды С++ ==
Как сравнить две лямбда-функции в С++ (Visual Studio 2010)?
std::function<void ()> lambda1 = []() {};
std::function<void ()> lambda2 = []() {};
bool eq1 = (lambda1 == lambda1);
bool eq2 = (lambda1 != lambda2);
Я получаю ошибку компиляции, утверждая, что оператор == недоступен.
EDIT: Я пытаюсь сравнить экземпляры функций. Поэтому lambda1 == lambda1 должен возвращать true, а lambda1 == lambda2 должен возвращать false.
Ответы
Ответ 1
Вы не можете сравнивать объекты std::function
, потому что std::function
не эквивалентен равенство. Тип замыкания лямбда также не равен равенству.
Однако, если ваша лямбда ничего не захватывает, сама лямбда может быть преобразована в указатель функции, а указатели функций равны сопоставимым (однако, насколько мне известно, он полностью не определен, является ли в этом примере are_1and2_equal
true
или false
):
void(*lambda1)() = []() { };
void(*lambda2)() = []() { };
bool are_1and1_equal = (lambda1 == lambda1); // will be true
bool are_1and2_equal = (lambda1 == lambda2); // may be true?
Visual С++ 2010 не поддерживает это преобразование. Преобразование не было добавлено в С++ 0x до момента, когда был выпущен Visual С++.
Ответ 2
Вы не можете сравнивать функции, заканчивая.
Вы можете в большинстве случаев сравнивать указатели на функции на языках, имеющих эту концепцию (это также то, что, например, EQ делает в Lisp. И это не работает для эквивалентных функций, которые не занимают одно и то же место в памяти.)
Ответ 3
Это невозможно.
Доказательство эскиза: если бы можно было вычислить
f1 == f2
тогда можно было бы вычислить
f == infiniteLoop
и решить проблему остановки.
Ответ 4
Самый простой ответ: весь оператор шаблона < > class== ==() s является закрытым.
Последующий вопрос: что, если бы вы ожидали следующего:
- сравнить адрес функций
- сравнить два разных объекта (типа std:: function < void() >
- сравнить две абстрактные функции
Изменить (почти 5 лет спустя):
Я нахожу забавным, что есть ниспадающие без комментариев. Если downvotes - это потому, что С++ 11 изменил уровень доступа для std:: function:: operator ==(), то я говорю, что избиратель не понимает, как работает время. Если downvotes - это потому, что вопросник не уточнил, что он предположил, что оператор ==() будет сравнивать, возможно, избиратель должен увидеть многочасовую дискуссию с помощью комментариев сразу под вопросом, на который OP ответил только в комментариях к моему ответу.