Подтвердить что ты не робот

Оператор лямбды С++ ==

Как сравнить две лямбда-функции в С++ (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.

4b9b3361

Ответ 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 ответил только в комментариях к моему ответу.