C++11 中初始化变量的推荐方法是使用大括号初始化,但我几乎从未在 for 循环中看到过这一点:
// regular initialization
for(auto i = my_vector.size(); i > 0; --i){
…
}
// brace-init-list initialization
for(auto i{my_vector.size()}; i > 0; --i){
…
}
这被认为是不好的形式还是由于历史原因没有这样做?
对于标准 C++11 和 14,您的第二个示例实际上应该不起作用,因为i
的类型将被推导出为 std::initializer_list<int>
。
这将在 C++17 中更改,以便正确推断类型为 int
。您已经可以看到更改的原因是,直接初始化上下文中的std::initializer_list
推导被视为标准缺陷,因此一些编译器已经纠正了这一点。由于不能依赖于给定编译器版本是否实现了此更改,因此最好不要将此初始化形式用于可移植代码。
括号初始化在auto
上有点缺陷,参见N3922。
反向循环的正确便携式方法:
for(auto i = my_vector.size(); i--;)
对于前向循环:
for(auto j = my_vector.size(), i = 0; i < j; ++i)