Обеспечивает ли запись const auto& [a, b] = f();
продление срока службы объекта, возвращаемого из f()
, или, по крайней мере, связаны объекты a
и b
? Прочитав предложение, я не вижу ничего очевидного на этом языке, чтобы убедить меня, что это произойдет, если только оно не будет покрыто чем-то другим. Тем не менее, следующее не продлевает время жизни временного, поэтому я не вижу, как он будет покрыт:
const auto& a = std::get<0>(f());
В верхней части статьи, похоже, предполагается, что она покрыта
cv-квалификаторы и ref-квалификатор объявления декомпозиции применяются к ссылке, введенной для инициализатора, а не для отдельных псевдонимов элементов
Но в предложенной формулировке для фактического стандарта самое близкое упоминание, которое я вижу ниже, хотя я не уверен, как его прочитать, чтобы получить гарантию, которую я ищу:
если e - несферированное id-выражение, обозначающее lvalue или reference введенный из идентификатора-списка объявления декомпозиции, decltype (e) является ссылочным типом, указанным в спецификации объявление разложения
Кажется, что gcc и clang продлевают время жизни объекта, возвращаемого до конца области, основываясь на эксперименте wandbox . уродливый, реализующий все колокола и свистки для моего собственного типа, как представляется, увеличивает время жизни внешнего объекта и других его членов.
Хотя почти наверняка намерения авторов, я хотел бы точно знать, что язык гарантирует, что это безопасно.