为什么在逗号分隔符上下文中将预增量的结果转换为 void?

Fur*_*ish 6 c++ casting comma-operator

std::for_each_n可能的实现

template<class InputIt, class Size, class UnaryFunction>
InputIt for_each_n(InputIt first, Size n, UnaryFunction f)
{
    for (Size i = 0; i < n; ++first, (void) ++i) {
        f(*first);
    }
    return first;
}
Run Code Online (Sandbox Code Playgroud)

我注意到我们通常看到的部分i++(或首选++i)由两个操作组成:

  • ++first
  • (void) ++i

用逗号分隔。虽然大部分都说得通,但(void)演员阵容对我来说似乎有点令人惊讶。我只能猜测是,有可能是超载operator ,,是以推导型的InputItSize这将导致一些令人吃惊的副作用。这可能是原因吗?如果是,我们确定演员void阵容完全解决了这个问题吗?

Jar*_*d42 4

难道是这个原因吗?

处理运算符逗号的邪恶重载确实是一个很好的理由。

我没有看到其他(有效的)原因。

如果是,我们确定强制转换可以void完全解决该问题吗?

是的,我们不能使用重载运算符逗号void(也不能转换为void)。