在他关于 2017 年秋季标准会议的报告中,Herb Sutter 提供了以下示例,说明带有初始化程序的基于范围的 for 语句正在简化什么:
{
T thing = f();
for (auto& x : thing.items()) {
// Note: “for (auto& x : f().items())” is WRONG
mutate(&x);
log(x);
}
}
为什么for (auto& x : f().items())
错了?也就是说,什么时候f().items()
产生未定义的行为但T thing = f(); ... thing.items()
不产生它?
(这个问题可能被认为是重复的,但答案只是通过编写问题而不是通过正常搜索来揭示,所以我认为值得将其包含在 StackOverflow 中。)