Подтвердить что ты не робот

Почему возвращает адрес локальной переменной или временного только предупреждения, а не ошибки?

Только что получил предупреждение от компилятора для этой функции:

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", а не ограничения языка?

Я не могу думать ни о чем.

4b9b3361

Ответ 1

Нет веской причины, почему это не должно быть ошибкой, только С++ standard не рассматривает этот случай как таковой и соответствующие компиляторы придерживайтесь стандарта.

Однако рекомендуется предупредить предупреждение:

§12.2.5.2 Срок жизни временной привязки к возвращаемому значению в операторе return функции (6.6.3) не продлевается; временное уничтожается в конце полного выражения в операторе return.

[...]

[Примечание. Это может привести к обманутой ссылке, и рекомендуется внедрение выдать предупреждение в таком случае. - конечная нота]

Акцент мой.

Ответ 2

Причина: Отсутствие согласованности в генерации ошибки компилятора.

В вашем прямом деле компилятор действительно помогает генерировать предупреждение. Рассматривайте это как бонус.
Но посмотрите ниже, где компилятор не распознает эту проблему:

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

Теперь с точки зрения компилятора это не оправдано, если оно дает ошибку для одного случая, а в другом случае оно выкидывает из-за сложности кода.

Одним из вариантов использования такого ограничения компилятора может быть "Генерация случайных чисел", как это было предложено @tsuki.