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

Vin*_*ent 15 c++ for-loop comma void c++11

以下代码来自cppreference.comstd::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);
}
Run Code Online (Sandbox Code Playgroud)

为什么(void)循环中有一个,没有把它放在那里会有什么后果?

use*_*670 24

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

  • @Passer By :: boost :: assign (2认同)
  • @Passer来自https://github.com/facebook/folly/blob/master/folly/Expected.h#L556 (2认同)

小智 6

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

您可能知道也可能不知道operator ,可以为类型重载.因此,在使用诸如++first1, ++first2或甚至只是的陈述时可能会产生无意的后果first1, first2.

(void)投放在那里,以便任何超载operator ,不能生效,因为运营商无法在不完整的操作void类型.