在 C++11 中使用支撑初始化初始化循环被认为是错误的形式



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)

最新更新