为什么 (void) 在 for 循环中的两个逗号分隔语句之间
Why (void) between two comma separated statements in a for loop
以下代码来自std::lexicographical_compare
在cppreference.com上的一个实现示例:
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)
,不放那会有什么后果?
如果 InputIt1
类型的前缀增量运算符返回的值的类型重载了逗号运算符,则表达式 ++first1, ++first2
可能会调用它,因此将 ++first2
的结果转换为 void
确保不会调用重载的逗号运算符,因为重载的逗号运算符不能接受 void
作为参数。
这似乎是一个偏执的实施者掩盖了他们的基础,因为他们不知道他们正在处理的类型的确切细节。
您可能知道也可能不知道 operator ,
可以为类型重载。因此,在使用 ++first1, ++first2
甚至 first1, first2
.
等语句时可能会产生意想不到的后果
将 (void)
转换放在那里,这样任何重载的 operator ,
都无法生效,因为运算符无法对不完整的 void
类型进行操作。
以下代码来自std::lexicographical_compare
在cppreference.com上的一个实现示例:
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)
,不放那会有什么后果?
如果 InputIt1
类型的前缀增量运算符返回的值的类型重载了逗号运算符,则表达式 ++first1, ++first2
可能会调用它,因此将 ++first2
的结果转换为 void
确保不会调用重载的逗号运算符,因为重载的逗号运算符不能接受 void
作为参数。
这似乎是一个偏执的实施者掩盖了他们的基础,因为他们不知道他们正在处理的类型的确切细节。
您可能知道也可能不知道 operator ,
可以为类型重载。因此,在使用 ++first1, ++first2
甚至 first1, first2
.
将 (void)
转换放在那里,这样任何重载的 operator ,
都无法生效,因为运算符无法对不完整的 void
类型进行操作。