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

Why is returning address of local variable or temporary only a warning and not an error?

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

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;
}

,我想知道为什么返回局部变量或临时变量的地址不会出错。在某些情况下您必须这样做吗?这只是 "undefined behaviour" 而不是语言限制的理由是什么?

我想不出任何一个。

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

但是,鼓励发出警告:

§12.2.5.2 The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.

[...]

[Note: This may introduce a dangling reference, and implementations are encouraged to issue a warning in such a case. — end note ]

重点是我的。

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

在您的直接情况下,编译器实际上有助于生成警告。将其视为 奖金.
但是请寻找编译器无法识别此问题的以下情况:

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

现在从编译器的角度来看,如果它在一种情况下给出错误而在另一种情况下由于代码的复杂性而退缩是不合理的。

这种编译器限制的一个用例可以是 "Random Number generation" @tsuki 很好地建议。