为啥 std::transform 和类似的东西将“for”循环增量转换为(void)?

Posted

技术标签:

【中文标题】为啥 std::transform 和类似的东西将“for”循环增量转换为(void)?【英文标题】:Why does std::transform and similar cast the 'for' loop increment to (void)?为什么 std::transform 和类似的东西将“for”循环增量转换为(void)? 【发布时间】:2016-07-13 16:27:53 【问题描述】:

下面代码中(void) ++__result的作用是什么?

std::transform 的实现:

// std::transform
template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)

    for (; __first != __last; ++__first, (void) ++__result)
        *__result = __op(*__first);
    return __result;

【问题讨论】:

不知道写风格指南的人是否真的认为如果作者写了static_cast&lt;void&gt;(++__result),这段代码会更清晰... 【参考方案1】:

operator, 可能会过载。将任一操作数转换为 void 可防止调用任何重载运算符,因为重载运算符不能采用 void 参数。

【讨论】:

哇。这是我永远不会想到的。 @Angew 有很多这样的。如需更多乐趣,请阅读 Microsoft 编译器工程师 STL 的this post。 以类似的方式,您会看到在标准库中大量使用addressof 或等效项,而不是一元&amp; @JDługosz Ha。是的,一个类可以提供,但它不会被使用。到void 的转换将始终只是丢弃该值,而不查看哪些转换运算符可用。调用此类运算符的唯一方法是显式调用 expr.operator void() std::who_made_comma_overloadable【参考方案2】:

如果有的话,它会避免调用重载的operator,。因为void 类型不能是函数(运算符)的参数。

另一种方法是在中间插入void()

++__first, void(), ++__result

【讨论】:

以上是关于为啥 std::transform 和类似的东西将“for”循环增量转换为(void)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将 x 和 y 标签设置为 pd.plot() 的参数,而我可以轻松设置类似的东西,例如标题?

std :: transform一元操作签名

应用`std::transform()`函数后向量元素的意外行为[重复]

理解std::transform

std::transform 到任意容器

未设置 lambda 返回类型时 std::transform 中的附加副本