Что такое оператор в C++?
пока я пытался узнать об C++ операторы, я наткнулся на странный оператор сравнения на cppreference.com,* в таблице, которая выглядела так: "Ну, если это обычные операторы в C++, я лучше их изучу", - подумал я. Но все мои попытки разгадать эту тайну были безуспешны. Даже здесь, на переполнении стека, мне не повезло в моем поиске.
есть ли связь между и C++?
и если есть, то что именно делает этот оператор?
* в то же время cppreference.com обновил эту страницу и теперь содержит информацию о<=>оператора.
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.