为什么 std::iterator 不包含 std::prev() 作为成员函数?

sia*_*ock 4 c++ iterator std member-functions non-member-functions

it++;                       // OK    : Widely used expression for moving iterator.

it_prev = it-1;             // ERROR : What I expected; + - operators never existed
it_prev = std::prev(it)     // OK

it_next3 = it+3;            // ERROR : also, nothing like this exists
it_next3 = std::next(it,3)  // OK
Run Code Online (Sandbox Code Playgroud)

为什么 Iterator 类没有 + - 运算符作为成员函数?

或者std::prev()作为成员函数来做到这一点?

it_prev = it.prev()         // nothing like this
Run Code Online (Sandbox Code Playgroud)

定义prev迭代器外部的函数是否有特殊原因?

眠りネ*_*ネロク 5

如果prev()成员函数而不是自由函数,则它的通用性会降低,因为无法将内置类型(例如,指针)用作迭代器:

int *ptr = ...
// ...
ptr.prev() // <-- Pointers don't have member functions!!
Run Code Online (Sandbox Code Playgroud)

而对于非成员函数模板,例如std::prev(),它与指针一起工作所需要的只是一个处理指针的特化:

int *ptr = ...
// ...
std::prev(ptr); // <-- OK
Run Code Online (Sandbox Code Playgroud)

指针还支持递增递减运算符(即++--),因此在迭代器类中定义它们不会妨碍泛型编程。同样的推理适用于二元运算符+-