Nos últimos dias, alguns de nossos leitores informaram que encontraram um erro de lucro de 1.
Aprovado: Fortect
Este erro ocorre quando colocamos sempre o mesmo à esquerda do operador =, bem como as variáveis à direita. Então, eles gastam arr como o endereço e o lado de parada é, sem dúvida, constante, então o erro muito provavelmente aparecerá como o valor L necessário.
ArchnzacProvavelmente será usado como uma variável global e indica um bom erro útil sólido que ocorreu durante uma decisão de função. Você pode encontrar vários códigos de erro para
“lvalue” provavelmente será um destino de atribuição. “L” significa excelente, pois o lado esquerdo é um símbolo. Rvalue é o valor correto da mão e gera um único valor que não pode e não pode ser atribuído instantaneamente. Se você obtiver um “lvalue obrigatório”, significa que todos têm uma expressão que retorna um rvalue sempre que um lvalue é necessário.
Para o seu modelo atual, uma constante é um valor r, mas nunca um valor l de um. Então:
10 = 2; // Não é bem treinado, atribuição de rvalueint i; (i + 1) é 2; // Formado incorretamente, rvalue obtém um grande valor.
int i;i = 2;
Faça isso. Observe que você pode retornar um lvalue de qualquer tipo de função; Por exemplo, você pode obter uma referência que pode ser um objeto que usa o rider = ().
Como Pavel Minaev apontou em algum tipo de comentário, esta não é a definição usual sobre lvalues e rvalues na respectiva língua, pelo contrário, é uma tentativa de informar alguém que possui um bug no uso de rvalues E onde um valor forte é considerado um critério necessário. C ++ é uma linguagem por causa de seus quase todos os detalhes; Se você deseja vir oficialmente, é necessário entrar em contato com um representante autorizado.
Os termos lvalue e rvalue não são mais comumente encontrados na seleção C / C ++, mas quando você o faz, seu significado geralmente não fica imediatamente aparente. Na maioria das vezes, esses termos são inquestionavelmente incluídos em mensagens de erro e de aviso do compilador. Exemplo de compilação se você seguir com gcc :
Isso mesmo, este código é inerentemente bizarro e não o que você escreveria, mas como a mensagem de erro lvalue menciona, é um termo frequentemente encontrado em tutoriais C / C ++. Outro exemplo é compilar esta senha com g ++ :
Aqui, o erro específico está novamente relacionado ao misterioso rvalue. Então, o que lvalue rvalue significa em C e C ++? Isso é o que eu realmente quero explorar neste artigo.
Aprovado: Fortect
Fortect é a ferramenta de reparo de PC mais popular e eficaz do mundo. Milhões de pessoas confiam nele para manter seus sistemas funcionando de forma rápida, suave e livre de erros. Com sua interface de usuário simples e mecanismo de verificação poderoso, o Fortect localiza e corrige rapidamente uma ampla gama de problemas do Windows, desde instabilidade do sistema e problemas de segurança até gerenciamento de memória e gargalos de desempenho.
int foo () return 2;int main () foo () é 2; Retorna 0;
test.c: No aspecto" principal ":test.c: 8: 5: erro lvalue: exigido como um operando de atribuição disponível
O que você vê , a definição do valor L?
O valor de s é na verdade um dos seguintes: a maneira de pensar em variáveis de qualquer tipo; Uma promessa subscrita ([]) que não corresponde a uma combinação específica. Expressão indireta unária (*) que não pode se referir a uma matriz. Expressão do valor L para parênteses.
testcpp.cpp: na função int & foo ():testcpp.cpp: 5:12: Erro: inicialização incorreta de um link não persistenteA chave para fazer com 'int &' de put 'int'
Definição prática
Esta seção contém uma explicação intencionalmente simplificada de lvalues e rvalues. O resto do artigo explicará essa habilidade.
O
Que é cada exemplo de um erro lvalue?
Erros de lvalue ocorrem quando o novo lvalue não é uma variável que infelizmente pode conter um valor. LValue é uma constante viável (ou) não uma variável. Esses são caracteres alfanuméricos únicos. (5, a, 6,9, $, etc.) Exemplo: em vez de a = 5; no programa superior, se pudesse ser 5, significa um; será um erro LValue. LValue é, sem dúvida, uma variável constante.
lvalue (valor localizador) representa inquestionavelmente o objeto no qual o fato ocupa uma localização famosa (ou seja, a memória gera um endereço).
rvalue é definido por omissão, dizendo que a expressão é um lvalue ou um rvalue substancial. Assim, um grande rvalue, longe da ideia de um lvalue acima, é um termo que não significa que um objeto ocupa sua localização identificável que carrega memória.
Exemplos simples
Os termos acima podem parecer confusos, por isso é extremamente importante perder alguns exemplos simples.
Suponha que comemos uma variável inteira percebida e atribuída:
A atribuição espera um adorável lvalue como seu operando abandonado, e var provavelmente é um lvalue, já que é um elemento reconhecível. Os seguintes elementos não são válidos para encaminhar sua página atual:
Nem o inteiro absolutamente consistente 4 nem a expressão var + 1 são lvalues (o que torna esses caras rvalues). Este não é um valor l, porque as respostas particulares são expressões temporárias sem uma localização exata bem conhecida (isto é, elas podem ter passado recentemente por todo o registro temporário para o recurso mais importante do cálculo). não há sugestão semântica – não há lugar para atribuir.
Assim, o significado da mensagem de erro em nosso primeiro trecho de código deve ser claro. foo imposto retorna um valor temporário, o que certamente é um rvalue muito bom. Tentar atribuir isso pode é um erro efetivo, se for o caso, foo () implica 2; o compilador reclama quando espera que você veja um lvalue devido ao operador de atribuição no lefta.
Um valor de 1 envia a expressão de pessoas para o objeto que existe após este tipo de. O valor r é um importante prazer temporário que não é armazenado fora da evolução que o usa.
No entanto, nem todos os mapeamentos de resultados de chamada de função genérica são inválidos. Por exemplo, as referências C ++ tornam isso possível:
Aqui foo obtém um link, que é um valor de pessoas I para o qual pode ser designado. Na verdade, a capacidade do C ++ de reconhecer valores l de funções é importante para trabalhar em outros operadores sobrecarregados. Um exemplo típico é sobrecarregar o operador de gancho [] em programas de treinamento que implementam algum tipo de acesso de pesquisa. an std :: map faz o seguinte:
A atribuição de mymap [10] funciona melhor porque sua sobrecarga não const std :: road :: operator [] retorna um mapa que os especialistas afirmam poder ser atribuído .
4 implica var; // CULPA!(var + 1) = 4; // CULPA!
int globalvar = 20;int & foo () Pague por uma variável global;princípio interno () foo () é 10; rei 0;
lvalue significaria aquela entrada à esquerda. Em particular, o lado esquerdo deve ter um operador de atribuição. rvalue significa o verdadeiro valor da página. Em particular, é uma avaliação ou frase realmente ruim significativa do vendedor de trabalhos de casa.
std :: mapmymap;mymap [10] implica 5,6;
Valores editáveis I.
Originalmente, depois que lvalues foram definidos para It c, esse valor poderia significar literalmente “valores adequados para o lado esquerdo da atribuição”. Porém, mais tarde, quando ISO C continha a palavra-chave const , esta é a definição que deve ser esclarecida. Afinal:
Então, apenas mais esclarecimentos como forma de adicionar. Nem todos os valores podem permanecer afetados. Essas crenças podem ser alteradas. Formalmente, o padrão C99 resulta em valores mutáveis, por exemplo:
o lvalue atual nunca tem um tipo de array, não usa seu tipo incompleto, não tem um último tipo const permitido e, se for uma estrutura somme ou união, n ‘não tem outro membro definido (incluindo, recursivamente, cada elemento ou nome de todos os agregados ou uniões contidos) com um novo const qualificado.
const int significa 10; // 'a' é o valor 1a é igual a 10; // mas não pode ser atribuído!
Conversão entre Lvalues e Rvalues
Normalmente, as construções verbais da língua inglesa que operam em objetos assumem quando rvalues são requeridos como argumentos. Por exemplo, você vê, o operador de adição binária '+' pega dois rvalues vendidos como argumentos e retorna um rvalue:
Como vimos anteriormente, a e também b são dois valores L. Portanto, na terceira linha, eles convertem implicitamente o valor l específico em valor r. Todos os lvalues, que, por sua vez, não são matrizes, funções ou tipos incompletos, também podem ser convertidos em rvalues.
E vice-versa? Pode rvalues ser alterado para lvalues? Claro que não! Isso provavelmente violaria o estilo e design de um bom valor, conforme definido [1].
Isso não significa que lvalues não possam ser gerados explicitamente a partir de rvalues. Por exemplo, qualquer tipo de operador unário '*' (desreferência) recebe um novo argumento rvalue bem elaborado, mas essencialmente produz um excelente resultado lvalue. Dê uma olhada neste número válido:
Acelere o desempenho do seu computador agora com este simples download.