post 递增 weakly_incrementable 的有用性?

Usefulness of post-incrementing a weakly_incrementable?

我最近研究了 weakly_incrementable 概念,我想知道 post-increment operator 有什么用,因为该概念没有定义对操作结果的任何要求。

return void operator++(int) 真的可以吗?

void operator++(int) { ++(*this); }

它似乎符合该概念的其他要求(例如它不必是可复制的)并且还符合 incrementable 概念引入的要求使 i++ 有用的事实,但在那种情况下,我想知道为什么 i++ 完全由这个概念定义。毕竟,当你需要一些东西来实现 weakly_incrementable 概念时,你总是可以使用 ++i 而不是 i++ 因为

  1. 你不能指望 i++ 有任何有用的属性,除了 ++i 已经提供的属性,但是
  2. i++ 可能效率更低(例如,当它创建迭代器的副本时)。

该设计决策记录在 P0541 中。

Is it actually okay to return void for operator++(int)?

是的。这是。如论文所述,进行了一次特定的民意调查。

也考虑过完全删除后缀增量,但是:

The authors of the Ranges TS strongly prefer keeping the postfix increment operator for input iterators. Consider the following fairly common (anti-)pattern:

for (auto i = v.begin(); i != v.end(); i++) {
// ...
}

Aside from concerns over the cost of post-increment, there is nothing wrong with this code per se, and the authors see no compelling reason to break it. And by permitting i++ to return void, we would actually be mitigating the performance problem.