C ++ primer 5-е изд. shared_ptr и ассоциативные контейнеры - PullRequest
0 голосов
/ 07 августа 2020

В C ++ Primer 5-е изд. Стэнли Липманн, глава 15 OOP сказано:

std::multiset<std::shared_ptr<Quote>, decltype(compare)*> items{compare};

Элементы в нашем мультимножестве - shared_ptrs, и для shared_ptr есть не менее чем оператор. В результате мы должны предоставить нашу собственную операцию сравнения, чтобы упорядочить элементы (§11.2.2, стр. 425). Здесь мы определяем частный член stati c с именем compare, который сравнивает isbns объектов, на которые указывает shared_ptrs. Мы инициализируем наш мультимножество для использования этой функции сравнения через инициализатор класса (§7.3.1, стр. 274): "

Но если я попробую это:

// a class that doesn't define < operator
struct A
{
    int x = 0;
};


int main()
{
    std::shared_ptr<A> pa(make_shared<A>());
    std::shared_ptr<A> pb(make_shared<A>());

    cout << (pb < pa) << endl; // 0

}
  • Почему мой код работает, хотя класс A не определяет оператор меньше чем?

  • Дело в том, что после проверки cppreference на class std::shared_ptr я обнаружил, что он перегружен реляционными операторами?!

  • Я также скомпилировал код для C ++ 11 и все еще отлично работает!

  • Итак, я бы хотел, чтобы кто-нибудь объяснил мне этот абзац в книге. Спасибо!

1 Ответ

2 голосов
/ 07 августа 2020

Почему мой код работает, хотя класс A не определяет оператор «меньше чем»?

Потому что неважно, какие операторы A имеют, если набор не содержит элементов типа A.

Набор содержит общие указатели.

Дело в том, что после проверки cppreference на класс std :: shared_ptr я обнаружил, что в нем есть перегруженные реляционные операторы? !

Cppreference верна.

Итак, я бы хотел, чтобы кто-нибудь объяснил мне этот абзац в книге.

Книга неверно.

...