Возвращение ссылки на временный объект из функции - PullRequest
0 голосов
/ 03 декабря 2018

Рассмотрим следующий код -

#include <iostream>
#include <stdio.h>

const int & retRef() {
    return 6;
}

int main()
{
    const int& k = retRef();
    printf("Value: %d\n", k);
    printf("Address: %p\n", &k);
    printf("Value: %d\n", k);
    return 0;
}

Вывод -

Value: 6
Address: 0x7ffd45bf544c
Value: 32692

Почему значение изменилось после печати адреса переменной k?Если я заменю строку const int& k = retRef() на const int& k = 6;, результат будет таким, как ожидалось.

Почему это другое поведение?Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Ваш код имеет неопределенное поведение;Вы пытаетесь связать временный int (который составлен из литерала 6) со ссылкой в ​​качестве возвращаемого значения, но временный объект будет немедленно уничтожен, тогда retRef() всегда возвращает оборванную ссылку,и k тоже болтается.Любая разыменование в нем приводит к UB.

Всякий раз, когда ссылка связана с временным объектом или его подобъектом, время жизни временного объекта увеличивается, чтобы соответствовать времени жизни ссылки, со следующими исключениями:

  • временная привязка к return значению функции в операторе возврата не расширяется: она уничтожается сразу в конце выражения возврата.Такая функция всегда возвращает висячую ссылку.

С другой стороны, const int& k = 6; работает нормально, потому что время жизни временных данных продлено до времени жизни k, как указано выше.

0 голосов
/ 03 декабря 2018

В функции retRef вы возвращаете ссылку на локальную переменную.Объекты внутри функции будут уничтожены при выходе из функции, и все ссылки на нее станут недействительными.Использование этой ссылки повлечет за собой неопределенное поведение ...

const int & retRef()
{
    return 6;
}
0 голосов
/ 03 декабря 2018

Вы возвращаете ссылку на временный объект, который вызовет неопределенное поведение.Объект не будет доступен после возврата из функции.

n4659 - § 15.2:

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

...