Что такое оператор в 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.