为啥 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<void>(++__result)
,这段代码会更清晰...
【参考方案1】:
operator,
可能会过载。将任一操作数转换为 void
可防止调用任何重载运算符,因为重载运算符不能采用 void
参数。
【讨论】:
哇。这是我永远不会想到的。 @Angew 有很多这样的。如需更多乐趣,请阅读 Microsoft 编译器工程师 STL 的this post。 以类似的方式,您会看到在标准库中大量使用addressof
或等效项,而不是一元&
。
@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() 的参数,而我可以轻松设置类似的东西,例如标题?