为什么std :: advance不返回生成的迭代器?

Lin*_*gxi 5 c++ iterator c++-standard-library

目前,std::advance设计如下:

template< class InputIt, class Distance >
void advance( InputIt& it, Distance n );
Run Code Online (Sandbox Code Playgroud)

但是,我经常发现自己想要这样的东西:

template< class InputIt, class Distance >
InputIt advance( InputIt it, Distance n );
Run Code Online (Sandbox Code Playgroud)

那么,当前设计背后的原理是什么?这是出于性能方面的考虑吗?注意,std::nextstd::prev返回返回的迭代器。

Aar*_*onI 1

没有技术原因阻止它返回对输入值的引用,并且任何合理的编译器都应该能够优化返回值(如果不使用它)。所以如果他们愿意的话,他们可以这样做。

我认为从 API 设计的角度来看,他们的选择是有意义的 -std::prev接受std::next一个迭代器并返回一个分别指向上一个或下一个元素的不同迭代器,而不修改 input

std::advance另一方面修改输入。如果它返回对输入迭代器的引用,则可能会与返回副本而不就地修改输入的函数混淆。这可能有潜在的危险。

请注意,std::advanceInputIterators 一起使用,其中包括迭代器,其中迭代具有副作用(例如从流读取的迭代器),但std::prevstd::next只与 s 一起使用ForwardIterator,而 s 没有副作用。

因此,返回一个单独的(例如std::prevstd::next)将是一个坏主意 - 您最终会在同一个流上得到两个迭代器,这可能会对彼此产生不利影响。