为何在C++标准提案中使用(void)++current而非直接++current?
为什么
uninitialized_copy里要用(void)++current? 核心原因是避免触发用户自定义的逗号运算符重载,具体细节如下:
- 在C++的for循环增量部分,
++first, ++current是一个逗号表达式。如果++current返回的迭代器类型被用户重载了operator,,这个表达式的行为会被改写——不再是简单按顺序执行两个自增操作,而是会调用自定义的逗号运算符,完全违背代码的设计意图。 - 加上
(void)强制转换后,(void)++current的结果变为void类型。C++标准规定,当逗号表达式的任一操作数是void时,会禁用用户自定义的operator,,编译器会按照内置逗号运算符的规则处理:依次执行两个子表达式,忽略返回值,确保++first和++current严格按顺序执行,不会有意外的重载干扰。 - 这也是标准库的防御性编程习惯:虽然标准迭代器通常不会重载逗号运算符,但代码必须兼容所有符合
nothrow_forward_iterator概念的用户自定义迭代器,用(void)可以彻底杜绝这种潜在的行为异常。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

