为什么 it1++ 有效,但 it1=it1+1 无效,其中 it1 是列表容器的迭代器

Why `it1++` works, but `it1=it1+1` does not, where it1 is iterator of list container

给定一个名为 itstd::list 迭代器,it1++ 等价于 it1=it1+1。那么为什么 it1++ 工作正常,但 it1=it1+1 在下面的代码中给出错误?

代码

#include <iostream>
#include <list>

int main()
{
    std::list<int> l1{19, 2, 3, 21, 5, 19, 7, 11};
    std::list<int>::iterator it1;

    std::cout << "1st\n";
    it1 = l1.begin();
    it1++;
    it1 = it1 + 1; // This giving error
}

输出

Invalid operands to binary expression
 ('std::list<int>::iterator' (aka '_List_iterator<int>') and 'int')

回复:“it1++ 等同于 it1=it1+1” -- 事实并非如此。对于内置数字类型来说确实如此,但是一旦重载运算符发挥作用,就没有内在联系在两个运算符之间。std::list 的迭代器是 forward 迭代器;它们没有 operator+,但它们确实有 operator++.

编辑、阐述:

A forward 迭代器让你按顺序向前移动。为此,它提供了 operator++ 的两个重载,因此您可以编写 it++++itstd::forward_list 提供前向迭代器。

一个双向迭代器让你在一个序列中向前和向后移动。除了前向迭代器提供的操作外,它还提供了operator--的两个重载,这样你就可以写成it----itstd::list 提供双向迭代器。

一个随机访问迭代器让你移动到序列中的任意位置。除了双向迭代器提供的这种操作之外,它还提供了 operator+ 的重载,以便您可以编写 it + 3。它还提供了 operator[] 的重载,因此 it[n] 等同于 *(it + n)std::vector 提供随机访问迭代器。