"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > ## **A vinculação de uma referência constante a um subobjeto de um temporário prolonga sua vida útil? Uma história de GCC e Clang**

## **A vinculação de uma referência constante a um subobjeto de um temporário prolonga sua vida útil? Uma história de GCC e Clang**

Publicado em 2024-11-09
Navegar:352

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

Vinculando uma referência constante a um subobjeto de um temporário

Comportamento padrão

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.

GCC e Clang Diferenças

  • GCC (versão 5.2.0): Destrói a instância P2d temporária antes de inserir printf em main, preservando o valor criando outro duplo temporário.
  • Clang (versão X): Estende o tempo de vida da instância P2d temporária para o tempo de vida da referência x, chamando o destruidor após printf em main.

Explicações

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.

Conclusã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.

Tutorial mais recente Mais>

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