C ++ лямбда-оператор == - PullRequest
       3

C ++ лямбда-оператор ==

14 голосов
/ 21 октября 2010

Как сравнить две лямбда-функции в C ++ (Visual Studio 2010)?

std::function<void ()> lambda1 = []() {};
std::function<void ()> lambda2 = []() {};
bool eq1 = (lambda1 == lambda1);
bool eq2 = (lambda1 != lambda2);

Я получаю ошибку компиляции, утверждающую, что оператор == недоступен.

РЕДАКТИРОВАТЬ: I 'Я пытаюсь сравнить экземпляры функции.Поэтому lambda1 == lambda1 должен возвращать true, тогда как lambda1 == lambda2 должен возвращать false.

Ответы [ 4 ]

14 голосов
/ 21 октября 2010

Вы не можете сравнивать 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 C ++ 2010 не поддерживает это преобразование . Преобразование не было добавлено в C ++ 0x до выпуска Visual C ++.

3 голосов
/ 21 октября 2010

Невозможно сравнить функции, конец.

Вы можете максимально сравнить указатели с функциями в языках, которые имеют эту концепцию (это также, например, что EQ делает в Лиспе. И это не работает для эквивалентных функций, которые не занимают одно и то же место в памяти.)

1 голос
/ 22 октября 2010

Это невозможно.

Эскиз доказательства: если бы можно было вычислить

f1 == f2

, то было бы также возможно вычислить

f == infiniteLoop

и решитьпроблема остановки.

0 голосов
/ 21 октября 2010

Самый простой ответ: все операторы шаблонной <> функции класса == () являются частными.

Дополнительный вопрос: Что, если вы ожидали следующего:
- сравнить адрес функций
- сравнить два разных объекта (типа std :: function
- сравнить две абстрактные функции

Редактировать (почти 5 лет спустя):

Мне показалось забавным, что есть отрицательные отзывы без комментариев.Если отрицательные отзывы вызваны тем, что C ++ 11 изменил уровень доступа для std :: function :: operator == (), то я говорю, что избиратель не понимает, как работает время.Если отрицательные отзывы вызваны тем, что спрашивающий не уточнил, что сравнивает предполагаемый оператор == (), возможно, избиратель должен увидеть многочасовое обсуждение в комментариях сразу под вопросом, на который ФП ответил только в комментариях к моему ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...