Практическое значение сильного порядка и слабого порядка - PullRequest
0 голосов
/ 03 июля 2018

Я немного читал о последовательном сравнении в C ++ 20 * (то есть operator<=>), но не мог понять, в чем практическая разница между strong_ordering и weak_ordering (то же самое относится и к _equality версия для этого способа).
Кроме того, что он очень наглядно описывает заменяемость типа, действительно ли он влияет на сгенерированный код? Добавлены ли какие-либо ограничения на использование типа?
Хотелось бы увидеть пример из жизни, демонстрирующий это.

1 Ответ

0 голосов
/ 03 июля 2018

Добавлены ли какие-либо ограничения на использование типа?

Одним очень существенным ограничением (которое не предполагалось в первоначальной статье) было принятие значения strong_ordering P0732 в качестве индикатора того, что тип класса может использоваться как не введите параметр шаблона. weak_ordering недостаточно для этого случая из-за того, как должна работать эквивалентность шаблона.

Как правило, возможно, что некоторые алгоритмы просто требуют weak_ordering, но другие алгоритмы требуют strong_ordering, поэтому возможность пометить, что для типа может означать ошибку компиляции (обеспечивается недостаточно сильный порядок) вместо простого отказа выполнить Требования алгоритма во время выполнения и, следовательно, просто неопределенное поведение. Но все алгоритмы в стандартной библиотеке и TS диапазонов, о которых я знаю, просто требуют weak_ordering. Я не знаю ни одного, который требует strong_ordering от макушки головы.

Действительно ли это влияет на сгенерированный код?

За исключением случаев, когда требуется strong_ordering, или алгоритм явно выбирает другое поведение на основе категории сравнения, нет.

...