在循环中使用逗号

时间:2018-12-08 11:16:32

标签: c++

template <class _InputIterator, class _OutputIterator>
inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
    for (; __first != __last; ++__first, (void) ++__result)
        *__result = *__first;
    return __result;
}

我从标准模板库中获取了以上代码,常见含义是什么?是铸造吗?类似于初始化多条语句?但是在这种情况下,投射

1 个答案:

答案 0 :(得分:2)

问题是有人可能用重载的逗号运算符创建了一个时髦的迭代器类型:

struct my_funky_iterator {
    // various normal iterator operations
    my_funky_iterator operator,(my_funky_iterator) const;
};

有了重载,表达式

++__first, ++__result

增加两个迭代器,然后然后调用 重载逗号作为结果。那应该是无害的,但是在这里会使逗号运算符超载的人也不必担心在该运算符内部做可怕的事情。

因此代码添加了强制类型转换,以避免调用可能的重载逗号运算符:

++__first, (void)++__result

现在,编译器正在寻找一个逗号运算符,该运算符将my_funky_iterator作为其第一个参数并将void作为其第二个参数。唯一的方法是将第一个参数转换为void并使用内置的逗号运算符,就像表达式已编写

(void)++__first, (void)++__result

编写自己的算法时,这种偏执程度是否合适取决于您。 (您可能希望将前一句中的“偏执狂”替换为“小心”)