文章预览
本篇介绍几个细琐的小特性,可以使代码更加安全可靠。 最常见的情况是采取 for loop 遍历某个容器,比如: std :: vector < int > v( 10 ); std ::ranges::iota(v, 0 ); for ( int i = v.size() - 1 ; i >= 0 ; --i) { std :: cout < ' '; } 乍看之下,似乎并无问题,但实际上却存在安全隐患,若是 v.size() 的结果大于 std::numeric_limits ::max() ,将产生 UB。 倘若你使用了类型推导,问题会更加明显。 for ( auto i = v.size() - 1 ; i >= 0 ; --i) { std :: cout < ' '; } 这会输出超出预期的结果! i 被推导为 unsigned 整型, i >= 0 将永远为真。 这种隐患来自于类型的隐式转换,一般编译器只会给出警告。最简单的解决之法就是保证整型符号的一致性,例如: for ( size_t i = v.size() - 1 ; i std :: cout < ' '; } 结束条件也随之变为检测数据范围,以避免条
………………………………