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

时间:2015-06-03 11:26:52

标签: 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;
}

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

我想不到任何。

2 个答案:

答案 0 :(得分:18)

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

但是,鼓励发出警告:

  

§12.2.5.2函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁。

     

[...]

     

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

重点是我的。

答案 1 :(得分:7)

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

直接的情况下,编译器实际上有助于生成警告。将其视为奖励 但请查看下面的情况,编译器无法识别此问题:

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

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

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