为什么默认情况下C ++关联容器的谓词不透明?

时间:2019-01-10 18:56:47

标签: c++ containers predicate associative

自C ++ 14起,我们拥有std::less<void>透明性,并且在大多数情况下更有用,所以有理由为什么,例如,std::set仍然以std::less<Key>作为谓词,默认,而不是std::less<void>,除非是历史原因。

有用的案例:std::set<std::string>::findstd::string_view等。

1 个答案:

答案 0 :(得分:3)

这样做会破坏当前的工作代码。想象我有

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 <