В 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 и все еще отлично работает!
Итак, я бы хотел, чтобы кто-нибудь объяснил мне этот абзац в книге. Спасибо!