将 preincrement 结果强制转换为 void 的原因

luk*_*keg 4 c++

cppreference为可能的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)

为什么是++icast to的结果void?是因为我们丢弃了++i抑制可能的编译器警告的结果吗?如果是这样,为什么++firstnot cast tovoid也是如此?因为operator ,隐式丢弃它?

Bri*_*ian 10

++first, (void) ++i
Run Code Online (Sandbox Code Playgroud)

首先,++first被评估,然后(void) ++i被评估。

当我还是 C++ 初学者时,我认为这是一些特殊的语法,可以让您在 for 循环的“增量”步骤期间执行多个操作。然而实际上并没有这种特殊的语法。之所以在这里可以采取两个动作,是因为逗号运算符用于将两个表达式合并为一个表达式。

由于逗号运算符是可重载的,并且std::for_each_n是一种通用算法,因此用户定义了第一个参数是InputIt类型的重载逗号运算符的可能性很小。这不是特别可能,但有可能。所以,为了保证我们只是简单地做++first然后++i,没有其他副作用,有必要强制使用内置的逗号运算符。这是通过将参数之一强制转换为 来完成的void:您不能有void参数operator,(或任何其他函数),因此这可以防止调用任何用户定义的重载。