我一直在听C++中的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?
等于运算符对指针的关系运算符有语义限制:
==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和真值结果.[C++03§5.10p2]
关系运算符对比较指针有限制:
如果同一类型的两个指针p和q指向不是同一个对象的成员或同一个数组的元素或不同函数的不同对象,或者只有其中一个为null,则p <q,p的结果> q,p <= q,p> = q未指定.[§5.9p2]
这是一个由等式运算符"继承"的语义限制吗?
具体来说,给出:
int a[42];
int b[42];
Run Code Online (Sandbox Code Playgroud)
很明显,(a + 3)<(b + 3)是未指定的,但是(a + 3)==(b + 3)也未指定?
C++ primer,5th,14.8.2,使用带有算法的库函数对象:
vector<string *> nameTable; // vector of pointers
// error: the pointers in nameTable are unrelated, so < is undefined
sort(nameTable.begin(), nameTable.end(),
[](string *a, string *b) { return a < b; });
// ok: library guarantees that less on pointer types is well defined
sort(nameTable.begin(), nameTable.end(), less<string*>());
Run Code Online (Sandbox Code Playgroud)
然后我检查了std :: less实现:
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x < __y; }
};
Run Code Online (Sandbox Code Playgroud)
我发现std :: less也使用operator <来完成工作,所以为什么<未定义且库保证指针类型的定义较少,为什么std:少推荐,为什么std …