Что такое оператор в C++?


пока я пытался узнать об C++ операторы, я наткнулся на странный оператор сравнения на cppreference.com,* в таблице, которая выглядела так: "Ну, если это обычные операторы в C++, я лучше их изучу", - подумал я. Но все мои попытки разгадать эту тайну были безуспешны. Даже здесь, на переполнении стека, мне не повезло в моем поиске.

есть ли связь между и C++?

и если есть, то что именно делает этот оператор?

* в то же время cppreference.com обновил эту страницу и теперь содержит информацию о<=>оператора.

3 172

3 ответа:

это называется трехстороннее сравнение оператора.

по словам P0515 реферат:

есть новый трехсторонний оператор сравнения <=>. Выражение a <=> b возвращает объект, который сравнивает <0 Если a < b, сравнивает >0 если a > b, и сравнивает ==0 если a и b равны/эквивалент.

писать все сравнения для вашего типа, просто напишите operator<=> что возвращает соответствующий тип категории:

  • возвращение an _ordering если ваш тип естественно поддерживает <, и мы будем эффективно генерировать <,>,<=,>=,== и !=; в противном случае верните an _ Equality, и мы будем эффективно генерировать == и !=.

  • возврат сильный, если для вашего типа a == b подразумевает f(a) == f(b) (подстановочность, где f читает только сравнение-заметное состояние доступно с помощью неприватного интерфейса const), в противном случае возврат слабый.

The cppreference говорит:

выражения оператора трехстороннего сравнения имеют вид

lhs <=> rhs   (1)  

выражение возвращает объект,

  • сравнивает <0 Если lhs < rhs
  • сравнивает >0 если lhs > rhs
  • и сравнивает ==0 если lhs и rhs равны/эквивалент.

On 2017-11-11, комитет ISO C++ принял Херб Саттерна "космический корабль" трехсторонний оператор сравнения как одна из новых функций, добавленных к C++20. В статье под названием последовательное сравнение Саттер, Маурер и Браун демонстрируют концепции нового дизайна. Для обзора предложения, вот отрывок из статьи:

в выражение a b возвращает объект, который сравнивает если a , сравнивает >0 если a > b, и сравнивает ==0 если a и b равный / эквивалентный.

общий случай: чтобы написать все сравнения для вашего типа X с типом Y, с memberwise семантикой, просто напишите:

auto X::operator<=>(const Y&) =default;

запущенных случаях: Чтобы написать все сравнения для вашего типа X с типом Y, просто писать оператор что происходит Y, можно использовать по умолчанию чтобы получить семантику memberwise, если это необходимо, и возвращает соответствующий тип категории:

  • возвратить _ordering если ваш тип естественно поддерживает , и мы будем эффективно генерировать симметричный ,>, ,>=,==, и !=; в противном случае возвращает _equality, и мы будем эффективно генерировать симметричный == и !=.
  • Return качественные товары!! Хоро если для вашего типа a = = b подразумевает f (a) = = f(b) (взаимозаменяемости, где f читает только сравнение-заметное состояние, что можно с помощью общественности const членов), в противном случае возврат слабак_.

Категории Сравнения

пять категорий сравнения определяются как std:: типы, каждый из которых имеет следующие предопределенные значения:

+--------------------------------------------------------------------+
|                  |          Numeric  values          | Non-numeric |
|     Category     +-----------------------------------+             |
|                  | -1   | 0          | +1            |   values    |
+------------------+------+------------+---------------+-------------+
| strong_ordering  | less | equal      | greater       |             |
| weak_ordering    | less | equivalent | greater       |             |
| partial_ordering | less | equivalent | greater       | unordered   |
| strong_equality  |      | equal      | nonequal      |             |
| weak_equality    |      | equivalent | nonequivalent |             |
+------------------+------+------------+---------------+-------------+

неявные преобразования между этими типами определяются следующим образом:

  • strong_ordering со значениями {less,equal,greater} неявно преобразует к:
    • weak_ordering со значениями {less,equivalent,greater}
    • partial_ordering со значениями {less,equivalent,greater}
    • strong_equality со значениями {unequal,equal,unequal}
    • weak_equality со значениями {nonequivalent,equivalent,nonequivalent}
  • weak_ordering со значениями {less,equivalent,greater} неявно преобразуется в:
    • partial_ordering со значениями {less,equivalent, greater}
    • weak_equality со значениями {nonequivalent,equivalent,nonequivalent}
  • partial_ordering со значениями {less,equivalent,greater,unordered} неявно преобразуется в:
    • weak_equality со значениями {nonequivalent,equivalent,nonequivalent,nonequivalent}
  • strong_equality со значениями {equal,unequal} неявно преобразуется в:
    • weak_equality со значениями {equivalent,nonequivalent}

трехстороннее сравнение

Theмаркер. Последовательность символов<=>разбивает на<= >, в старом исходном коде. Например,X<&Y::operator<=>необходимо добавить пробел, чтобы сохранить его значение.

перегружаемый оператор<=>три функции сравнения и имеет приоритет выше, чем< и ниже<<. Он возвращает тип, который можно сравнить с литералом0но другие типы возвращаемых значений разрешены, например, для поддержки шаблонов выражений. Все<=>операторы, определенные в языке и в стандартной библиотеке возвращают один из 5 вышеупомянутыхstd::сопоставление типов категорий.

для типов языков, следующие встроенные<=>предусмотрены однотипные сравнения. Все они constexpr, если не указано иное. Эти сравнения не могут быть вызваны гетерогенно с помощью скаляра акции / конверсии.

  • наbool, интегральные и указательные типы,<=>возвращаетstrong_ordering.
  • для типов указателей различные CV-квалификации и преобразования производных в базу позволяют вызывать однородный встроенный<=>, и есть встроенные гетерогенныеoperator<=>(T*, nullptr_t). Только сравнения указателей на один и тот же объект/выделение являются постоянными выражениями.
  • для фундаментальных типов с плавающей запятой,<=> возвращаетpartial_ordering, и может вызываться неоднородно путем расширения аргументов до большего типа с плавающей запятой.
  • для перечисления<=> возвращает то же самое, что и базовый тип перечисления<=>.
  • наnullptr_t,<=> возвращаетstrong_orderingи всегда даетequal.
  • для массивов копировать,T[N] <=> T[N]возвращает тот же тип, какT ' s<=>и выполняет лексикографическое сравнение поэлементно. Нет никакого<=>для других матрицы.
  • наvoidнет<=>.

чтобы лучше понять внутреннюю работу этого оператора, читать в оригинале статьи.

этот ответ стал неактуальным, так как ссылка на веб-страницу изменилась

The веб-страница, на которую вы ссылаетесь была сломана. Он редактировался много в тот день, и разные части не были синхронизированы. Статус, когда я смотрел на него был:

в верхней части страницы перечислены существующие операторы сравнения (в C++14). Нет никакого <=>там.

в нижней части страницы, они должны быть перечислены те же операторы, но они оплошали и добавили это будущее предложение.

gcc Не знаю, о <=>еще (и с -std=c++14, никогда не будет), так он думает, что вы имели в виду a <= > b. Это объясняет сообщение об ошибке.

если вы попробовать то же самое через пять лет вы, вероятно, получите лучшее сообщение об ошибке, что-то вроде <=> not part of C++14.