Почему возвращает адрес локальной переменной или временного только предупреждения, а не ошибки?
Только что получил предупреждение от компилятора для этой функции:
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", а не ограничения языка?
Я не могу думать ни о чем.
Ответы
Ответ 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.