«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > ## **Продлевает ли привязка постоянной ссылки к подобъекту временного объекта срок его жизни? Повесть о GCC и Clang**

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

Опубликовано 9 ноября 2024 г.
Просматривать:518

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

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

Стандартное поведение

Поведение при привязке постоянной ссылки к подобъекту временного значения определяется стандартом C и варьируется в зависимости от поставщика компилятора.

GCC и Clang Отличия

  • GCC (версия 5.2.0): Уничтожает временный экземпляр P2d перед вводом printf в main, сохраняя значение путем создания другого временного двойника.
  • Clang (версия X): Продлевает время жизни временного экземпляра P2d до времени жизни ссылки x, вызывая деструктор. после printf в main.

Пояснения

Согласно CWG 1651, результат доступа к члену или выражения индекса, примененного к prvalue, следует рассматривать как xvalue. Это означает, что привязка ссылки к такому подобъекту временного объекта не должна продлевать время жизни временного объекта.

Однако в приведенном примере оба компилятора рассматривают center().x как значение prvalue. GCC не продлевает время жизни при использовании скалярных подобъектов, поскольку они не охвачены [dcl.init.ref]/(5.2.1.1). Следовательно, временный объект может быть уничтожен раньше.

Напротив, Clang реализовал ожидающее разрешение DR 1651, в котором говорится, что если E1 является временным выражением, а E2 не обозначает битовое поле, то E1 .E2 — это временное выражение. Поскольку в соответствии с этим определением center() является временным выражением, применяется измененная формулировка в [class.temporary]/5. В нем явно указано, что соответствующий временный объект сохраняется в течение всего времени жизни ссылки.

Поэтому в этом случае Clang продлевает время жизни временного экземпляра P2d, а GCC — нет.

Заключение

Ожидается, что текущее поведение GCC и Clang изменится после принятия предлагаемых изменений стандарта C.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3