Трехстороннее сравнение указателя на функции не удается - PullRequest
3 голосов
/ 10 марта 2020

Почему я не могу сравнить указатели на функции с G CC trunk?

using f_t = int(*)(int);
f_t a { nullptr }, b { nullptr };
auto c = a <=> b;

int main (){}

дает

a.cpp:4:13: error: invalid operands of types ‘f_t’ {aka ‘int (*)(int)’} and ‘f_t’ {aka ‘int (*)(int)’} to binary ‘operator<=>’
    4 | auto c = (a <=> b) == 0;
      |           ~ ^~~ ~
      |           |     |
      |           |     f_t {aka int (*)(int)}
      |           f_t {aka int (*)(int)}

1 Ответ

4 голосов
/ 10 марта 2020

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

Вместо того, чтобы идти по иногда неуказанному маршруту, C ++ 20 просто запрещает использование <=> для необъектных указателей .

Вы можете проверить равенство между такими указателями, но не их относительное упорядочение. Если вам по какой-то причине необходимо сделать это, вы можете привести указатели к void* s и использовать std::less<> для таких сравнений.

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