O comportamento ao vincular uma referência constante a um subobjeto de um temporário é definido pelo padrão C e varia dependendo do fornecedor do compilador.
De acordo com o CWG 1651, o resultado de um acesso de membro ou expressão de subscrito aplicada a um prvalue deve ser tratado como um xvalue. Isso implica que vincular uma referência a tal subobjeto de um temporário não deve estender a vida útil do temporário.
No entanto, no exemplo fornecido, ambos os compiladores tratam center().x como um pré-valor. O GCC não estende a vida útil ao usar subobjetos escalares porque eles não são cobertos por [dcl.init.ref]/(5.2.1.1). Portanto, o objeto temporário pode ser destruído antecipadamente.
Em contraste, Clang implementou a resolução pendente para DR 1651, que afirma que se E1 for uma expressão temporária e E2 não designar um campo de bit, então E1 .E2 é uma expressão temporária. Como center() é uma expressão temporária de acordo com esta definição, o texto modificado em [class.temporary] /5 se aplica. Ele afirma explicitamente que o objeto temporário correspondente persiste durante a vida útil da referência.
Portanto, Clang estende a vida útil da instância P2d temporária neste caso, enquanto o GCC não.
Espera-se que o comportamento atual do GCC e do Clang mude assim que as revisões propostas para o padrão C forem adotadas.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3