gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:03:32 27 4
gpt4 key购买 nike

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;
}

为什么是 ++i的结果投到 void ?是不是因为我们丢弃了 ++i的结果?抑制可能的编译器警告?如果是这样,为什么 ++first不强制转换为 void还有?因为 operator ,隐式丢弃它?

最佳答案


++first, (void) ++i

第一, ++first被评估,然后 (void) ++i被评估。

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

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

关于c++ - 将 preincrement 结果强制转换为 void 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60816991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com