ualificações CV de pré-valores (revisitado
Este é um acompanhamento do meuprevious question, onde o consenso aparente foi que a mudança no tratamento das qualificações de CV de pré-valores era apenas uma mudança bastante pequena e inconseqüente, destinada a resolver algumas inconsistências (por exemplo, funções retornando pré-valores e declaradas com tipos de retorno qualificados para CV
No entanto, vejo outro lugar no padrão que parece depender de pré-valores com tipos qualificados para cv: inicialização deconst
referências com pré-valores através de conversão de materialização temporária. A redação relevante pode ser encontrada em vários pontos em 9.3.3 / 5
[...] Se o inicializador convertido for um pré-valor, seu tipo T4 será ajustado para o tipo “cv1 T4” ([conv.qual]) e a conversão temporária de materialização ([conv.rval]) será aplicada [... ]
[...] Caso contrário, a expressão do inicializador é implicitamente convertida em um valor inicial do tipo "cv1 T1". A conversão temporária de materialização é aplicada e a referência é vinculada ao resultad
A intenção é obviamente garantir que, quando chegarmos ao conversão de materialização temporária
.3.4 Conversão temporária de materialização
1 Um pré-valor do tipo T pode ser convertido em um x-valor do tipo T. Essa conversão inicializa um objeto temporário ([class.temporary]) do tipo T a partir do pré-valor, avaliando o pré-valor com o objeto temporário como objeto de resultado e produz um xvalue indicando o objeto temporário. [...]
o tipoT
que recebe como entrada inclui as qualificações de cv exigidas.
Mas como essa qualificação cv sobrevive à 7.2.2 / 2 no caso de não valor de classe sem matriz?
7.2.2 Tipo
2 Se um pré-valor tiver inicialmente o tipo “cv T”, em que T é um tipo sem classe e sem matriz, sem cv, o tipo da expressão será ajustado para T antes de qualquer análise posterio
Or faz isso?
Por exemplo. que tipo de temporário temos neste exemplo
const int &r = 42;
O temporário éconst
ou não? Nós podemos faze
const_cast<int &>(r) = 101; // Undefined or not?
sem desencadear um comportamento indefinido? Se não me engano, a intenção original era obter umconst int
temporário nesses casos. Ainda é verdade? (Para tipos de turma, a resposta é clara - obtemos umconst
emporário.)