Я заметил, что подпись std :: max:
шаблон<имя T>
const T& max (const T&, const T&);
и я задавался вопросом о последствиях возвращения ссылки на const
T …
Если мы передадим два L-значения, то имеет смысл вернуть ссылку на
один из двух. Но если мы передадим две PR-значения, то, что возвращается и
это безопасная вещь для использования?
Я говорил с некоторыми коллегами, и вот минимальный рабочий пример
вопрос: http://cpp.sh/4en4
#include <iostream>
int glob = 100;
class temp{
int* val;
public:
temp(int n = 0){
val = new int(n);
}
void print() const{ std::cout << "I store " << *val << std::endl; }
~temp(){
std::cout << "temp object died" << std::endl;
delete val;
val = &glob;
}
};
const temp& foo(const temp& a){
return a;
}
int main(){
const temp& b = foo(2);
std::cout << "Is it safe?" << std::endl;
b.print();
}
Без оптимизации:
временный объект умер Это безопасно? Я храню 100
С умеренным:
временный объект умер Это безопасно? Я храню -1992206527
Запуск этого с разными уровнями оптимизации дает разные
Результаты. Однако во всех случаях возврат ссылки
не продлевать срок службы локального объекта; его деструктор все еще
называется, хотя в одном случае мы, кажется, восстановить ссылку на
уничтоженный объект, а в другом у нас, кажется, есть свисающий указатель.
Цитирование из стандарта C ++, номер документа N4618:
12.2 пункт 6:
… когда ссылка связана с временным. Временный, к которому
ссылка
связанный или временный, который является полным объектом подобъекта, к которому
ссылка обязательна
за время существования ссылки, кроме:
(6.1) — Временный объект, связанный с опорным параметром в функции
вызов (5.2.2) сохраняется до завершения
полного выражения, содержащего вызов.
(6.2) — время жизни временной привязки к возвращенному значению в
оператор возврата функции (6.6.3) не является
продлен; временное уничтожается в конце полного выражения в
ответное заявление «.
Из (6.1) может показаться, что временный foo (2) должен существовать для всего
утверждение, которое инициализирует б.
Из (6.2) может показаться, что локальное «а» разрушается, что
фактически уничтожает временный foo (2), в результате чего b принимает
разрушенная стоимость.
1a. Что такое полное выражение, которое содержит временную сгенерированную
foo(2)
в const temp& b = foo(2);
1б. Может ли вторая ссылка const продлить срок службы временного?
Задача ещё не решена.
Других решений пока нет …