遍历在for循环中初始化的std :: array是否是未定义的行为?

问题描述

// This snippet
for (const float t : std::array{ 0.0f,0.33f,0.66f,1.0f }) {
  std::cout << "t = " << t << "\n";
}
// Yields the following (incorrect) values:
t = -3.91649e-28
t = 4.59037e-41
t = 2.66247e-44
t = 0

// Whereas this snippet ...
auto vals = std::array{ 0.0f,1.0f };
for (const float t : vals) {
  std::cout << "t = " << t << "\n";
}
// Yields the following (correct) values:
t = 0
t = 0.33
t = 0.66
t = 1

第一个代码段是未定义的行为,还是编译器错误?

更新: 这是使用std = c ++ 17和/ Ox在Visual Studio 16.7.2和16.7.3中编译的。 该错误仍然存​​在于我的Bug项目中,但是我无法使用类似的构建标记在一个小项目中重现该错误。如果我使用整数而不是浮点数,问题仍然存在。

解决方法

否,它不是UB,因为range-for循环确实会延长临时范围的寿命。 https://en.cppreference.com/w/cpp/language/range-for

如果range_expression返回一个临时变量,则将其生存期延长到循环结束(如绑定到转发参考__range所示),但请注意,range_expression中任何临时变量的生存期都不会延长。

考虑到事实,gcc对此代码没有问题,可能是MSVC错误。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...