В то время как я пытался узнать о C ++ операторов, я наткнулся на операторе странного сравнения на cppreference.com , * в таблице , которая выглядит следующим образом :
«Ну, если это обычные операторы в C ++, я лучше их изучу», - подумал я. Но все мои попытки выяснить эту тайну оказались безуспешными. Даже здесь, на переполнении стека, мне не повезло в поисках.
Есть ли связь между <=> и C ++ ?
И если есть, что именно делает этот оператор?
* Тем временем cppreference.com обновил эту страницу и теперь содержит информацию об <=>
операторе.
bar< foo::operator<=>
- пример того, как это может быть похоже на<--
оператора.Ответы:
Это называется трехсторонним оператором сравнения .
Согласно предложению P0515 :
Cppreference говорит:
источник
<0
», «сравнивает>0
» и «сравнивает==0
», они означают, что<=>
возвращает отрицательное, положительное или нулевое значение, в зависимости от аргументов. Так же, какstrncmp
иmemcmp
.'a' < 'a'
и'c' < 'a'
ложные,'a' < 'a'
и'a' < 'c'
нет. В сильном порядке верно следующее:a != b
→a < b || b < a
operator==(T x, T y) { return !(x < y) && !(y < x); }
иoperator!=(T x, T y) { return (x < y) || (y < x); }
- ах-ха! Конечно, это менее эффективно, чем истина, так==
как оно вызывает сравнение дважды, но все же аккуратно.< 0
значение true. То есть еслиa < b
тогда(a <=> b) < 0
всегда верно.В 2017-11-11 комитет ISO C ++ принял предложение Херба Саттера о трехстороннем операторе сравнения "космический корабль" <=> в качестве одной из новых функций, добавленных в C ++ 20 . В статье под названием « Последовательное сравнение» Саттер, Маурер и Браун демонстрируют концепции нового дизайна. Для обзора предложения, вот выдержка из статьи:
Категории сравнения
Пять категорий сравнения определены как
std::
типы, каждая из которых имеет следующие предопределенные значения:Неявные преобразования между этими типами определяются следующим образом:
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
}Трехстороннее сравнение
<=>
Маркер вводится. Последовательность символов<=>
токенизируется<= >
в старом исходном коде. Например,X<&Y::operator<=>
необходимо добавить пробел, чтобы сохранить его значение.Перегружаемый оператор
<=>
является трехсторонней функцией сравнения и имеет приоритет выше<
и ниже, чем<<
. Он возвращает тип, который можно сравнить с литералом,0
но допускаются и другие возвращаемые типы, например, для поддержки шаблонов выражений. Все<=>
операторы, определенные на языке и в стандартной библиотеке, возвращают один из 5 вышеупомянутыхstd::
типов категорий сравнения.Для языковых типов предусмотрены следующие встроенные
<=>
сравнения одного типа. Все являются constexpr , если не указано иное. Эти сравнения не могут быть вызваны гетерогенно, используя скалярные продвижения / преобразования.bool
, целочисленный и указатель типов<=>
возвращаетstrong_ordering
.<=>
, а встроенные гетерогенныеoperator<=>(T*, nullptr_t)
. Только сравнения указателей на один и тот же объект / распределение являются константными выражениями.<=>
возвращаетсяpartial_ordering
и может вызываться неоднородно путем расширения аргументов до большего типа с плавающей запятой.<=>
возвращает то же, что и базовый тип перечисления<=>
.nullptr_t
,<=>
возвратовstrong_ordering
и всегда даетequal
.T[N] <=> T[N]
возвращает тот же тип, чтоT
и s,<=>
и выполняет лексикографическое поэлементное сравнение. Нет<=>
для других массивов.void
нет<=>
.Чтобы лучше понять внутреннюю работу этого оператора, пожалуйста, прочитайте оригинальную статью . Это то, что я узнал с помощью поисковых систем.
источник
_equality
типы умерли: оказалось, что<=>
хорошо работает с четырьмя реляционными операторами, но не так хорошо с двумя операторами равенства (хотя есть некоторый интенсивный синтаксический сахар, поддерживающий общий случай, когда вы хотите, чтобы все они).Этот ответ стал неактуальным, так как ссылка на веб-страницу изменилась
Веб - страница , которую вы ссылаетесь была сломана. В тот день он много редактировался, и разные части не были синхронизированы. Статус, когда я смотрел на это был:
В верхней части страницы перечислены существующие в настоящее время операторы сравнения (в C ++ 14). Там нет
<=>
.Внизу страницы они должны были перечислить тех же операторов, но они обманывают и добавляют это будущее предложение.
gcc
пока не знает<=>
(и-std=c++14
никогда не узнает ), поэтому думает, что вы имели в видуa <= > b
. Это объясняет сообщение об ошибке.Если вы попробуете то же самое через пять лет, вы, вероятно, получите лучшее сообщение об ошибке, что-то вроде
<=> not part of C++14.
источник
<=>
оператору метку (начиная с C ++ 20), указывающую, в какой версии стандарта ее ожидать. Маркировка стандартов - это соглашение, которому следует cppreference.com. Конечно, у вас нет компилятора, который вернулся на машине времени, чтобы поддержать его для вас, но cpprefernce сообщает вам (правильно), чего ожидать.