Negli ultimi giorni, alcuni dei nostri lettori ci hanno suggerito di aver riscontrato un errore di valutazione.
Approvato: Fortect
Questo errore si verifica quando abbiamo usato le costanti a sinistra del = venditore e le variabili a destra. Quindi portano arr come indirizzo e i lati di arresto sono costanti, quindi l’errore apparirà più o meno come il valore L richiesto.
ArchnzacViene spesso utilizzato come variabile globale e generalmente un errore utile che si è verificato durante una chiamata di offerta. Puoi trovare vari codici di errore in
“lvalue” è un obiettivo di assegnazione. “L” sta perché sinistra, poiché il lato sinistro è un segno. Rvalue è il valore della mano corretto e produce un valore che non può e non può essere assegnato direttamente. Se ottieni un “lvalue richiesto”, la persona ha un’espressione che restituisce un eccellente rvalue quando è richiesto un lvalue.
Per il modello, una costante è un valore r, still , non un valore l di an. Quindi:
individuo = 2; // Non ben addestrato, assegnazione rvalueint io; (i + 1) è 2; // Formato in modo errato, rvalue ottiene un valore bolgreat.
int i;io = 2;
Fallo. Nota che puoi restituire un lvalue da una bella funzione; Ad esempio, è possibile focalizzare l’attenzione su un oggetto che utilizza l’operatore è uguale a ().
Come ha sottolineato Pavel Minaev trovato nei commenti, questa non è la solita idea di lvalue e rvalue nella rispettiva verbosità, ma piuttosto un tentativo di informare qualcuno che a sua volta ha un bug nell’uso di rvalue e proprio un lvalue è considerato un criterio necessario. Il C++ è un linguaggio per via dei suoi numerosi dettagli; Se vuoi venire ufficialmente, potresti dover contattare un rappresentante autorizzato.
I termini lvalue e rvalue spesso non si trovano comunemente nella programmazione C / C ++, ma quando lo fai, il loro significato di solito non è immediatamente evidente. Molto spesso, questi gruppi di parole sono inclusi negli errori del compilatore e nelle idee di avviso. Esempio di compilazione se segui con gcc :
Esatto, questo codice è fondamentalmente stravagante e non è quello che scriveresti, ma tuttavia, come menziona il messaggio di errore lvalue, è solo un termine che si trova spesso nei tutorial C / C ++. Un altro esempio è la compilazione di una password con g ++ :
Qui l’errore è di nuovo legato al misterioso rvalue. Quindi cosa significa lvalue rvalue durante C e C ++? Questo è ciò che voglio esplorare in questo articolo.
Approvato: Fortect
Fortect è lo strumento di riparazione PC più popolare ed efficace al mondo. Milioni di persone si affidano a milioni di persone per mantenere i loro sistemi in esecuzione veloci, fluidi e privi di errori. Grazie alla sua semplice interfaccia utente e al potente motore di scansione, Fortect trova e risolve rapidamente un'ampia gamma di problemi di Windows, dall'instabilità del sistema e problemi di sicurezza alla gestione della memoria e ai colli di bottiglia delle prestazioni.
int foo () return 2;intero principale () pippo() è 2; Restituisce 0;
test.c: Indubbiamente l'aspetto "principale":test.c: 8: 5: errore lvalue: richiesto come operando di assegnazione accessibile effettivo
Qual è sicuramente il definizione del valore L?
Il valore che punta a l è in realtà uno dei seguenti: il loro concetto di variabili di qualsiasi tipo; Una parola in pedice ([]) che non corrisponde a un array definito. Espressione indiretta unaria (*) che non può consultare un array. Espressione della L valutare tra parentesi.
testcpp.cpp: nella funzione int & foo():testcpp.cpp: 5:12: Errore: inizializzazione errata di un enorme collegamento non persistenteIl tipo da fare con 'int &' connesso con il tipo 'int'
Definizione pratica
Questa regione contiene una spiegazione intenzionalmente semplificata di lvalue e rvalue. Il resto dell’articolo ti insegnerà questo.
Il
Che sta andando essere un esempio di errore lvalue?
Posizione degli errori Lvalue quando il nuovo lvalue non è soggetto a spostamenti che potrebbero contenere un valore. LValue è la tua costante valida (o) non una variabile. Questi caratteri alfanumerici generalmente una tantum. (5, a, 6.9, $, ecc.) Esempio: invece di a = 5; nello specifico programma di cui sopra se potesse essere 5 significa a; sarà un errore LValue. LValue è una variabile costante.
lvalue (valore locatore) riguarda l’oggetto in cui il fatto occupa una posizione identificabile (ovvero, la memoria genera un indirizzo incredibile).
rvalue è definito dall’omissione, dicendo del fatto che ogni espressione è un lvalue o un nuovo buon rvalue. Quindi, un grande rvalue, lontano da questa definizione di un lvalue sopra, è un intervallo che non significa che un oggetto viene attaccato a una posizione identificabile che porta memoria.
Esempi semplici
I termini di cui sopra possono sembrare vaghi, quindi è estremamente importante perché dovrebbe omettere alcuni semplici esempi.
Supponiamo che qualcuno di noi abbia una variabile intera percepita e assegnata:
L’assegnazione prevede un adorabile lvalue come operando sinistro, e var di solito deve essere un lvalue, poiché è un buon elemento identificabile. I seguenti elementi non sono legittimi nella tua pagina corrente:
Né la mia costante intera 4 né la riflessione var + 1 sono lvalue (che potrebbero renderli rvalue). Questo non è un lvalue, perché entrambe le risposte sono espressioni temporanee senza una posizione identificabile esatta (cioè potrebbero essere state recentemente realmente nel registro temporaneo per la parte più urgente del calcolo). c’è un significato completamente semantico – non c’è nessun posto da assegnare.
Pertanto, il significato del messaggio di errore nel primo frammento di codice dovrebbe essere chiaro. pippo restituisce un valore temporaneo, che è un ottimo rvalue. Il tentativo di utilizzare l’outsourcing per questo è un errore effettivo, in tal caso, foo() implica 2; il compilatore lamenta che si aspettava di vedere lvalue esclusivo con l’operatore di assegnazione a sinistra.
Un valore 1 indirizza un’espressione all’oggetto che esiste anche dopo di essa. Il valore r è importante per un breve valore temporale che non viene memorizzato al di fuori dell’espressione esatta che lo utilizza.
Tuttavia, non molti mapping a risultati di chiamate di funzioni generiche non sono validi. Ad esempio, i riferimenti C ++ rendono questo molto probabile:
Qui foo ottiene un link, che è il tuo valore utile I a cui può essere assegnato. In effetti, la capacità del C++ di accettare l valori dalle funzioni è importante per l’implementazione di altri operatori in overload. Un tipico esempio potrebbe essere l’overload dell’operatore hook [] che si trova nelle classi che implementano un qualche tipo di connettività di ricerca. std :: map fa l’importante:
L’assegnazione di mymap [10] posti di lavoro perché il suo sovraccarico non costante una malattia a trasmissione sessuale :: map :: operator [] restituisce una guida che può essere assegnata .
4 consiglia var; // COLPA!(var + 1) = 4; // COLPA!
int globalvar = 20;int & foo () Paga per una variabile globale;in mezzo () foo() è stato 10; re 0;
lvalue dovrebbe dirti che hai lasciato la voce. In particolare, la posizione di sinistra merita un operatore di assegnazione. rvalue indica il valore fedele della pagina. In particolare, è anche una valutazione o una frase davvero negativa del venditore stesso dell’incarico.
std :: mapmiamappa;miamappa [10] = 5.6;
Valori modificabili I.
In origine, dopo l’impostazione di lvalue per It e, questo potrebbe letteralmente significare “valori adatti per il lato sinistro dell’assegnazione”. Tuttavia, in seguito, dopo che ISO C conteneva le frasi di ricerca const , questa definizione doveva essere chiarita. Dopotutto:
Quindi, un ulteriore chiarimento come modo di mettere. Non tutti gli lvalue possono rimanere interessati. Questa morale può essere cambiata. Formalmente, lo standard C99 passa a valori modificabili, ad esempio:
const int Indica 10; // 'a' è il valore 1a è la versione 10; // ma non può essere assegnato!
Conversione tra Lvalue e Rvalue
In genere, i costrutti del linguaggio orale che operano sugli oggetti presuppongono che i valori possono essere richiesti come argomenti. Ad esempio, che questo operatore di addizione binaria '+' prenda quattro rvalue disponibili come argomenti e restituisca un unico rvalue:
Come abbiamo visto in precedenza, il perfetto e b sono due riconoscimenti di L. Pertanto, nella terza riga, sostituiscono implicitamente il valore l con il valore r. Tutti i lvalue, che a loro volta non lo sono, sono array, funzioni o ordinamenti diversi incompleti e possono essere convertiti in rvalue.
E viceversa? Gli rvalue possono essere modificati in modo da avere lvalues? Ovviamente no! Ciò probabilmente violerebbe una sorta di natura di un buon lvalue come stabilito [1].
Ciò non significa che gli lvalue non possano essere generati continuamente in modo esplicito da rvalue. Ad esempio, qualsiasi tipo di operatore unario '*' (dereference) accetta il nuovo argomento rvalue particolare, ma essenzialmente produce un buon risultato lvalue. Dai un’occhiata a questo codice corretto:
Accelera ora le prestazioni del tuo computer con questo semplice download.