Share via


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ão Complex1 + Complex2 é avaliada, e o resultado é armazenado em um objeto temporário. Em seguida, a expressão temporary+ Complex3 é avaliada, e o resultado é copiado para ComplexResult (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ções for, if, while, do e switch.

Confira também

Blog de Herb Sutter sobre Referências, simplesmente