Objetos temporários
Um objeto temporário é um objeto sem nome criado pelo compilador para armazenar um valor temporário.
Comentários
Em alguns casos, é necessário que o compilador crie objetos temporários. Esses objetos temporários podem ser criados pelos seguintes motivos:
Para inicializar uma referência
const
com um inicializador de um tipo diferente do tipo subjacente da referência que está sendo inicializada.Para armazenar o valor de retorno de uma função que retorna um tipo definido pelo usuário (UDT). Esses temporários só serão criados quando o programa não copia o valor de retorno para um objeto. Por exemplo:
UDT Func1(); // Declare a function that returns a user-defined // type. ... Func1(); // Call Func1, but discard return value. // A temporary object is created to store the return // value.
Como o valor de retorno não é copiado a outro objeto, um objeto temporário será criado. Um caso comum mais comum onde os temporários são criados é durante a avaliação de uma expressão onde as funções sobrecarregadas do operador devem ser chamadas. Essas funções sobrecarregadas do operador retornam um tipo definido pelo usuário que geralmente não é copiado a outro objeto.
Considere a expressão
ComplexResult = Complex1 + Complex2 + Complex3
. A expressãoComplex1 + Complex2
é avaliada, e o resultado é armazenado em um objeto temporário. Em seguida, a expressão temporary+ Complex3
é avaliada, e o resultado é copiado paraComplexResult
(presumindo que o operador de atribuição não seja sobrecarregado).Para armazenar o resultado de uma conversão em um tipo definido pelo usuário. Quando um objeto de um determinado tipo é convertido explicitamente em um tipo definido pelo usuário, o novo objeto é criado como um objeto temporário.
Os objetos temporários têm um tempo de vida definido pelo ponto de criação e pelo ponto em que são destruídos. Qualquer expressão que cria mais de um objeto temporário acaba destruindo-os na ordem inversa à criação.
Quando ocorre a destruição de um temporário depende de como ele é usado:
Temporariamente usados para inicializar referências
const
:
Se um inicializador não for um valor l do mesmo tipo da referência que está sendo inicializada, um temporário do tipo de objeto subjacente será criado. Ele é inicializado pela expressão de inicialização. Esse objeto temporário será destruído imediatamente depois que o objeto de referência ao qual está associado é destruído. Como essa destruição pode acontecer bem depois da expressão que criou o temporário, às vezes é conhecida como extensão de tempo de vida.Temporariamente criado como um efeito da avaliação da expressão:
Todos os temporaries que não se enquadram na primeira categoria e que forem criados como resultado da avaliação da expressão são destruídos o final da instrução de expressão (ou seja, no ponto-e-vírgula), ou no final das expressões de controle para instruçõesfor
,if
,while
,do
eswitch
.
Confira também
Blog de Herb Sutter sobre Referências, simplesmente
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de