2

他关于 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 中。)

4

1 回答 1

3

如果t.items()返回对 的成员的引用tf().items()则将为您提供悬空引用,从而导致未定义的行为。

将其分解:f()将是一个临时的,将在items()调用返回后被销毁。如果items()返回对该临时成员的引用,则一旦该临时被销毁,它将变得悬空。

有关更多详细信息和编写方法的方式,请参阅https://stackoverflow.com/a/40955021/309334 ,这样他们就不会遇到这个问题。

于 2017-12-01T21:03:06.053 回答