为什么返回局部变量的地址或临时只是一个警告而不是错误?

Rob*_*son 22 c++ compiler-warnings

刚从编译器收到此函数的警告:

template<class T>
Matrix3x3<T> & operator - (Matrix3x3<T> const & p)
{
    auto m = Matrix3x3<T>(p);

    m.m11 = -m.m11; m.m12 = -m.m12; m.m13 = -m.m13;
    m.m21 = -m.m21; m.m22 = -m.m22; m.m23 = -m.m23;
    m.m31 = -m.m31; m.m32 = -m.m32; m.m33 = -m.m33;

    return m;
}
Run Code Online (Sandbox Code Playgroud)

,我想知道为什么返回局部变量或临时的地址不值得一个错误.是否有必须这样做的情况?这只是"未定义的行为"而不是语言约束的理由是什么?

我什么都想不到.

Ste*_*ppo 18

没有充分的理由说明它不应该是一个错误,只是C++标准不会这样处理这种情况,并且符合要求的编译器遵守标准.

但是,鼓励发出警告:

§12.2.5.2函数返回语句(6.6.3)中返回值的临时绑定的生存期不会延长; 临时在return语句中的full-expression结束时被销毁.

[...]

[注意:这可能会引入悬空参考,并鼓励实施在这种情况下发出警告. - 结束说明]

重点是我的.


iam*_*ind 7

原因:生成编译器错误时缺乏一致性.

在您的直接案例中,编译器实际上有助于生成警告.把它视为奖励.
但请查看下面的情况,编译器无法识别此问题:

int& foo ()
{
  int i = 1;
  static int j;
  return i? i : j;  // No warning in g++-5!
}
Run Code Online (Sandbox Code Playgroud)

现在从编译器的角度来看,如果它为一个案例提供错误并且在其他情况下由于代码的复杂性而导致鸡出错则不合理.

这种编译器限制的一个用例可以是@tsuki很好地建议的"随机数生成".

  • 你真的打开了警告吗?对于这个确切的情况,GCC会发出一个`return-local-addr`警告. (2认同)