Поведение при привязке постоянной ссылки к подобъекту временного значения определяется стандартом C и варьируется в зависимости от поставщика компилятора.
Согласно 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