C++标准中的矛盾?

And*_*nck 2 c++

A std::map必须满足第23.1.2/2段规定的关联容器的要求:

每个关联容器都在Key上进行参数化和一个排序关系比较,它对Key的元素产生严格的弱排序(25.3).此外,map和multimap将任意类型T与Key相关联.Compare类型的对象称为容器的比较对象.该比较对象可以是指向函数指针或具有适当函数调用操作符的类型的对象.

但是在第23.3.1/2段中,std::map模板被指定为:

template <class Key, class T, class Compare = less<Key>,
          class Allocator = allocator<pair<const Key, T> > >
class map;
Run Code Online (Sandbox Code Playgroud)

这似乎明确禁止使用函数指针Compare.这是矛盾还是我不能正确理解标准?

编辑:是的,我真正遇到的问题是为什么代码像GMan的例子:

struct foo
{
    int x;
};

bool compare_foo(const foo& x, const foo& y)
{
    return x.x < y.x;
}

std::map<foo, bool, compare_foo> fooMap;
Run Code Online (Sandbox Code Playgroud)

不会编译(是的,我愚蠢地混淆了Compare参数的类型和值).

APr*_*mer 7

比较是比较器的类型.事实上它是声明class而不是typename没有区别,你可以有一个指向函数作为类型的指针,并在map构造函数中给出你的函数.

#include <map>

bool myCmp(int a, int b) {
    return a < b;
}

void foo()
{
    std::map<int, char*, bool (*)(int, int)> m(myCmp);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这个:

class Compare
Run Code Online (Sandbox Code Playgroud)

并不意味着Compare必须是一个类.如果它说:它可能更清楚:

typename Compare
Run Code Online (Sandbox Code Playgroud)

您可以使用任何提供类似函数调用语义的类型,例如函数指针.