вообще
Саттер, в егопредложение для оператора "космический корабль" (раздел 2.2.2, внизу страницы 12), говорится:
Основывая все на<=>
и его тип возврата: Эта модель имеет основные преимущества, некоторые уникальные для этого предложения по сравнению с предыдущими предложениями для C ++ и возможностями других языков:
[...]
(6)Эффективность, включая, наконец, достижение абстракции с нулевыми издержками для сравнений: Подавляющее большинство сравнений всегда однопроходные. Единственное исключение генерируется<=
а также>=
в случае типов, которые поддерживают как частичное упорядочение, так и равенство. За<
однопроходный режим необходим для достижения принципа нулевых издержек, чтобы избежать повторения сравнений на равенство, таких какstruct Employee { string name; /*more members*/ };
используется вstruct Outer { Employeee; /*more members*/ };
- сегодняшние сравнения нарушают абстракцию с нулевыми издержками, потому чтоoperator<
наOuter
выполняет избыточные сравнения равенства, потому что он выполняетif (e != that.e) return e < that.e;
который проходит равный префиксe.name
дважды (и если имя совпадает, обходит равные префиксы других членовEmployee
вдвое больше), и это вообще нельзя оптимизировать. Как отмечает Каминьски, абстракция с нулевыми накладными расходами - это столп C ++, и достижение его для сравнений в первый раз является существенным преимуществом этого дизайна, основанного на<=>
.
Но затем он приводит этот пример (раздел 1.4.5, стр. 6):
class PersonInFamilyTree { // ...
public:
std::partial_ordering operator<=>(const PersonInFamilyTree& that) const {
if (this->is_the_same_person_as ( that)) return partial_ordering::equivalent;
if (this->is_transitive_child_of( that)) return partial_ordering::less;
if (that. is_transitive_child_of(*this)) return partial_ordering::greater;
return partial_ordering::unordered;
}
// ... other functions, but no other comparisons ...
};
Будет определятьoperator>(a,b)
какa<=>b > 0
не приводит к большим накладным расходам? (хотя в другой форме, чем он обсуждает). Этот код будет сначала проверять на равенство, а затем дляless
и, наконец, дляgreater
, а не только и непосредственно тестированиеgreater
.
Я что-то здесь упускаю?