for循环中两个逗号分隔语句之间的原因(void)

时间:2017-05-15 07:15:58

标签: c++ c++11 for-loop void comma

以下代码来自cppreference.com上的std::lexicographical_compare的实施示例:

template<class InputIt1, class InputIt2>
bool lexicographical_compare(InputIt1 first1, InputIt1 last1,
                             InputIt2 first2, InputIt2 last2)
{
    for ( ; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2 ) {
        if (*first1 < *first2) return true;
        if (*first2 < *first1) return false;
    }
    return (first1 == last1) && (first2 != last2);
}

为什么循环中有(void),不将它放在那里会有什么后果?

2 个答案:

答案 0 :(得分:24)

如果InputIt1类型的前缀增量运算符返回的值的类型具有重载的逗号运算符,则表达式++first1, ++first2可以调用它,因此将++first2的结果转换为{{1}确保不会调用重载的逗号运算符,因为重载的逗号运算符不能接受void作为参数。

答案 1 :(得分:6)

这似乎是一个偏执的实施者,因为他们不知道他们正在处理的类型的具体细节。

您可能知道也可能不知道operator ,可能因类型而过载。因此,使用++first1, ++first2first1, first2等语句时可能会产生无意的后果。

(void)广告投放在那里,以便任何重载的operator ,都无法生效,因为运算符无法对不完整的void类型进行操作。