Почему предикаты ассоциативных контейнеров C ++ по умолчанию не прозрачны? - PullRequest
0 голосов
/ 10 января 2019

Начиная с C ++ 14 у нас есть std::less<void>, который является прозрачным и более полезным в большинстве случаев, поэтому есть причины, например, например, std::set по-прежнему имеет std::less<Key> в качестве предиката по умолчанию, а не std::less<void> за исключением исторических причин.

Полезные случаи: std::set<std::string>::find с std::string_view и т. Д.

1 Ответ

0 голосов
/ 10 января 2019

Это нарушит текущий рабочий код. Представь, у меня есть

struct my_type
{
    int id;
    int bar;
};

namespace std {
    template<>
    struct less<my_type>
    {
        bool operator()(my_type const& lhs, my_type const& rhs)
        {
            return lhs.id < rhs.id; // bar doesn't need to be compared, only need unique id's in the container.
        }
    };
}

std::set<my_type> foo;

Если std::set был изменен на использование std::less<void>, то этот код больше не будет компилироваться, поскольку my_type не имеет operator <.

...