Здравствуйте, rg45, Вы писали:
R>Так это и есть битая ссылка, раз объект мертвый.
Скажем так, ссылка ведёт на объект, находящийся на стеке в вызывающей функции. То есть формально она не битая. И если бы у объекта не было деструктора, то ссылка бы вообще делала вид, что всё ништяк.
R>Попробуй использовать, например, std::string вместо int — спецэффекты будут поинтереснее.
Да то же самое примерно
; Function Attrs: noinline nounwind optnone uwtable
define linkonce_odr dso_local dereferenceable(32) %struct.IntWrapper* @"??$test@UIntWrapper@@@@YAAEAUIntWrapper@@$$QEAU0@@Z"(%struct.IntWrapper* dereferenceable(32) %0) #1 comdat {
%2 = alloca %struct.IntWrapper*, align 8
store %struct.IntWrapper* %0, %struct.IntWrapper** %2, align 8
%3 = load %struct.IntWrapper*, %struct.IntWrapper** %2, align 8
ret %struct.IntWrapper* %3
}
То есть ссылка возвращается нормальная. Дальше по коду строка разрушается сразу после вызова этой функции, если вывести что-то на экран, то выводится пустая строка.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте