вообще

Саттер, в егопредложение для оператора "космический корабль" (раздел 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.

Я что-то здесь упускаю?

Ответы на вопрос(3)

Ваш ответ на вопрос