Краткий ответ: это небезопасно.
Стандарт гарантирует, что временная переменная может быть связана с константной ссылкой , и в этом случае срок службы временного расширения увеличивается довремя жизни связанной ссылки .Проблема в вашем конкретном случае заключается в том, что ссылка на самом деле привязывает временную.
Когда вы вызываете MaxValue( s1, s2 )
, создаются две временные переменные типа int, которые привязываются к аргументам параметров a
и b
вMaxValue
.Это означает, что срок службы этих временных сотрудников продлен до завершения функции.Теперь в операторе возврата вашей функции вы берете вторую ссылку на один из временных объектов, и эта вторая ссылка не продлит срок службы.r2
не продлит срок жизни объекта, и у вас есть свисающая ссылка.
Обратите внимание, что из-за отдельной компиляции компилятор не может знать извне MaxValue
, является ли возвращенная ссылкак одному из аргументов или к совершенно другому объекту, который не является временным:
int const & OtherMaxValue( int const & a, int const & b ) {
static int value = 0;
value = (a > b? a : b);
return value;
}
Таким образом, невозможно предположить, нужно ли продлевать какое-либо время жизни какого-либо из этих времен.
В качестве примечания, для небольших объектов (таких как все целочисленные типы) передача по ссылке может быть на самом деле хуже, чем передача по значению.Также уже существует шаблон std::max
, который фактически реализует эту функцию.