Tento entender os tipos de expressão de C ++ e, quanto mais leio, mais confuso fiquei, pois acho o esboço do C ++ muito difícil de digerir e, portanto, prefiro outros recursos, mas eles se contradizem ou não levam em conta que o a redação e a definição entre versões do C ++ mudam bastante.
A seguir, refiro-me aos seguintes rascunhos:
- C ++ 11 [ n3690 ] ( versão final)
- C ++ 17 [ n4659 ] ( versão final)
- C ++ 20 [ n4835 ] (rascunho atual)
C++11
3.10 Valores e valores... Um prvalor (valor "puro") é um valor que não é um valor x. [Exemplo: o resultado da chamada de uma função cujo tipo de retorno não é uma referência é um prvalor. O valor de um literal como 12, 7.3e5 ou true também é um pré-valor. - exemplo final]
C++17
3.10 Valores e valores... Um pré-valor é uma expressão cuja avaliação inicializa um objeto ou um campo de bits ou calcula o valor do operando de um operador, conforme especificado pelo contexto em que ele aparece.
C++20
7.2.1 Categorias de valor *... Um pré-valor é uma expressão cuja avaliação inicializa um objeto ou um campo de bits ou calcula o valor de um operando de um operador, conforme especificado pelo contexto em que aparece, ou uma expressão que tem o tipo cv void.
Eu entenderia as alterações de redação e alguns ajustes serão feitos, mas para mim toda a definição é alterada. Alguém pode me ajudar a entender isso? Por exemplo, por que a sentença foi removida de que um prvalue é um rvalue que não é um xvalue? Ou por que o exemplo útil foi removido?
Respostas:
A definição de valor original era apenas um rótulo: deixamos de lado certos valores (ou seja, aqueles que não são valores x) e atribuímos um nome a eles. É impossível
this
usar o endereço deles, exceto por meio de uso incomum (mais ou menos porque são temporários), para que certas liberdades possam ser tomadas com sua criação e propagação sem quebrar nada. (Veja também uma discussão recente sobre eles não terem "identidade".)A nova definição diz explicitamente que um pré-valor é uma inicialização "esperando para acontecer": uma vez que um objeto de destino é identificado por ele, é o que é inicializado. (É importante observar que a inicialização ainda acontece quando o prvalor é construído, mas não onde está.) Isso se chama "elision obrigatório de cópia" com base na otimização equivalente que já era comum.
Como no exemplo, as novas definições de categoria de valor foram vistas como sendo tão mais simples que menos exemplos foram necessários. Ainda existe um para xvalues (que são a categoria mais sutil).
fonte