为什么std :: transform和类似的'for'循环增量转换为(void)?

wes*_*wes 75 c++

(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;
}
Run Code Online (Sandbox Code Playgroud)

小智 103

有可能超载operator,.转换任一操作数以void防止调用任何重载操作符,因为重载操作符不能接受void参数.

  • 哇.这永远不会发生在我身上. (27认同)
  • 或者`std :: who_made_comma_o​​verloadable` (17认同)
  • @Angew有很多这些.有关更多乐趣,请阅读Microsoft编译工程师STL的[this post](https://www.reddit.com/r/cpp/comments/1tedni/notsocommon_pitfalls_of_c_xpost_rcplusplus/ce7bqnu). (11认同)
  • 在类似的情况下,你会看到在标准库中大量使用`addressof`或等价而不是一元`&`. (6认同)
  • @JDługoszHa.是的,一个班级可以提供,但不会被使用.转换为"void"将始终只丢弃该值而不查看可用的转换运算符.调用这样的运算符的唯一方法是使用显式的`expr.operator void()`调用. (4认同)
  • 那么有可能让一个类提供一个`operator void()`吗? (2认同)

Aby*_*byx 5

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

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

++__first, void(), ++__result
Run Code Online (Sandbox Code Playgroud)