Продление срока службы временного объекта с использованием константной ссылки

Мне нужно несколько разъяснений относительно константной ссылки.
От эта ссылка:

const Foo &myFoo = FuncBar();

Постоянная ссылка продлила жизнь локального объекта. Но когда я проверил эта ссылка хотя они использовали константную ссылку

Sandbox(const string& n) : member(n) {}

время жизни строки «четыре» не увеличилось.

Sandbox sandbox(string("four"));

Они использовали предложение

Только местные ссылки продлевают срок службы.

Тогда во второй ссылке строка «четыре» не является локальной по отношению к основной функции и не должна ссылаться на const n продлить свою жизнь?
Так почему же срок жизни не продлевается во второй ссылке?

0

Решение

Две ссылки, на которые вы ссылались, отличаются в том смысле, что одна показывает использование локальной ссылки const, а другая показывает использование ссылки const члена класса.

Когда мы создаем локальные ссылки на const и ссылаемся на временный объект, тогда этот компилятор продлевает срок службы временной области до объема локальной ссылки на const.

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

Цитирую ответ от:
Продлевает ли константная ссылка временную жизнь?

Увеличение продолжительности жизни не транзитивно через аргумент функции. §12.2 / 5 [класс.время]:

Второй контекст, когда ссылка связана с временным. Временный объект, к которому привязана ссылка, или временный объект, являющийся полным объектом для подобъекта, к которому привязан временный объект, сохраняется в течение всего срока действия ссылки, за исключением случаев, указанных ниже. Временная привязка к элементу ссылки в ctor-initializer конструктора (§12.6.2 [class.base.init]) сохраняется до выхода из конструктора. Временная привязка к ссылочному параметру в вызове функции (§5.2.2 [expr.call]) сохраняется до завершения полного выражения, содержащего вызов.

Если вы проанализируете его правильно, вы поймете, что в обоих случаях срок жизни продлен до тех пор, пока область действия, из которой инициализируются ссылки, не будет действительной. Как только область, из которой ссылка выходит из области действия, временная становится недействительной.

Для локальной константной ссылки область видимости находится внутри функции, из которой она инициализируется в temp.
Для константной ссылки на член класса область является конструктором, где она инициализируется в temp.

Вы также должны прочитать эту статью GOTW:
https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]