Por que os tipos de expressão mudaram em C ++ entre versões?

13

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 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?

Daniel Stephens
fonte
3
Sou a favor de proibir tags de idioma específicas da versão. Exceto exatamente por esse tipo de perguntas.
curiousguy
" não leve em consideração que a redação e a definição entre as versões do C ++ mudam bastante. " Mas a definição realmente não mudou. Praticamente a expressão que era um pré-valor no C ++ 11 ainda é um pré-valor no C ++ 20.
Nicol Bolas
Onde está o 'contradizer (íon)' entre a versão? Qual é a sua pergunta exatamente?
Galigator 21/11/19
11
Desculpe pela alteração do C ++ 20 , mas notei uma inconsistência no padrão.
Maggyero 20/04

Respostas:

5

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 thisusar 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).

Davis Herring
fonte
Obrigado a você e aos comentaristas! Isso praticamente explica tudo!
Daniel Stephens