Как заставить STD :: Strong ::ordering - PullRequest
2 голосов
/ 24 апреля 2020

Испытывая новый T ie -интерцептор трехсторонний оператор сравнения <=> Мне было интересно, что может быть примером такого, что

struct Foo {
    /*
       ....
    */
    auto operator<=>(const Foo &rhs) const = default;
};

приведет к ошибка компилятора с

Foo Bar1;
Foo Bar2;
std::strong_ordering(Bar1 <=> Bar2);

, но не с

Foo Bar1;
Foo Bar2;
std::weak_ordering(Bar1 <=> Bar2);

Что было бы примером для Foo? Другими словами, как Foo не подразумевает заменяемость? Я знаю, что мог бы написать свою собственную реализацию оператора, которая возвращает std::weak_ordering ... less/greater/equivalent, но как заставить компилятор сделать это?

Я прочитал Практическое значение strong_ordering и weak_ordering среди другие пока.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2020

... но как заставить компилятор сделать это?

Когда вы используете auto в качестве возвращаемого типа по умолчанию operator<=>, компилятор выберет общее категория сравнения всех членов. Поэтому, если у вас есть что-то вроде:

// any type that is weakly ordered
struct Weak {
    bool operator==(Weak const&) const;
    std::weak_ordering operator<=>(Weak const&) const;
};

struct Foo {
    Weak w;
    int i;
    auto operator<=>(Foo const&) const = default;
};

, тогда использование <=> на двух экземплярах типа Foo даст вам weak_ordering, поскольку это общая категория сравнения Weak и int.

Точно так же, как дано:

struct Bar {
    float f;
    auto operator<=>(Bar const&) const = default;
};

Bar::operator<=> дает вам std::partial_ordering.

Нет основных типов языков, которые бы давали вам std::weak_ordering, но - это некоторые типы библиотек, которые могут:

// some typical C++17 comparable type
struct Widget {
    bool operator==(Widget const&) const;
    bool operator<(Widget const&) const;
};

struct LotsOfWidgets {
    std::vector<Widget> widgets;
    auto operator<=>(LotsOfWidgets const&) const = default;
};

* * * * * * * * * <=> здесь возвращает std::weak_ordering (чтобы не предполагать, что вы имели в виду под < и ==).

Или вы могли бы просто предоставить это себе. У вас нет для использования auto:

struct WeakInt {
    int i;
    friend std::weak_ordering operator<=>(WeakInt, WeakInt) = default;
};
1 голос
/ 24 апреля 2020

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

Так weak_ordering происходит = default, только если подобъект Foo сам использует weak_ordering.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...