In de afgelopen dagen hebben sommigen met betrekking tot onze lezers ons laten weten dat ze gezegend zijn met een fout met 1 waarde.
Goedgekeurd: Fortect
Deze fout treedt op wanneer we constanten op de rest van de = operator zetten en variabelen op rechts. Dus ze nemen arr als de deal en de stopkant is constant, dus een fout zal hoogstwaarschijnlijk verschijnen als de L-waarde.
ArchnzacHet wordt gebruikt als een complete globale variabele en geeft een nuttige fout aan die volgens experts is opgetreden tijdens een functieaanroep. U kunt verschillende foutcodes opzoeken in
“lvalue” is een projectdoel. “L” staat voor links, aangezien de overgebleven zijde een symbool is. Rwaarde is de acceptabele handwaarde en genereert een waarde die nooit en niet direct kan worden toegekend. Als je een “lvalue required” krijgt, heeft die persoon een formule die een rvalue teruggeeft als een lvalue zeker vereist is.
Voor het model is a iets dat een r-waarde is, maar geen l-waarde die aan an is gekoppeld. Dus:
1 = 2; // Niet goed opgeleid, rvalu opdrachtint ik; (i + 1) is 2; // Verkeerd gevormd, rvalue vangt grote waarde.
int i;ik betekent 2;
Doe het. Merk op dat je een lwaarde van een functie kunt terugdraaien; Eigenaren kunnen bijvoorbeeld een verwijzing naar een object krijgen die de operator = () gebruikt.
Zoals Pavel Minaev in de opmerkingen opmerkte, zou dit niet de gebruikelijke definitie van lvalues en rvalues in de respectieve taal moeten zijn, maar eerder een poging om iemand die een bug heeft te informeren door rvalues en waarbij bekend is dat een waarde een noodzakelijk criterium is. C++ is een spaans vanwege de vele details; Als u officieel wilt komen, moet u contact opnemen met een gecertificeerde vertegenwoordiger.
De tijdsperioden lvalue en rvalue komen niet vaak voor bij C / C++-programmering, maar als u dat zelf doet, is hun betekenis meestal niet meteen duidelijk. Meestal zijn deze termen opgenomen in compilerfout- en waarschuwingsberichten. Compilatievoorbeeld als iemand volgt met gcc :
Dat klopt, deze code is inherent kinky en niet hoeveel je zou schrijven, maar zoals het lvalue-foutidee vermeldt, is het een term die vaak wordt gezien in C / C ++ tutorials. Een andere omstandigheid is het compileren van dit wachtwoord met signifiant ++ :
Hier is de fout extra gerelateerd aan de cryptische rwaarde. Dus wat bereikt lvalue rvalue mean in C en C ++? Dit is wat ik in dit artikel wil onderzoeken.
Goedgekeurd: Fortect
Fortect is 's werelds meest populaire en effectieve pc-reparatietool. Miljoenen mensen vertrouwen erop dat hun systemen snel, soepel en foutloos blijven werken. Met zijn eenvoudige gebruikersinterface en krachtige scanengine kan Fortect snel een breed scala aan Windows-problemen vinden en oplossen - van systeeminstabiliteit en beveiligingsproblemen tot geheugenbeheer en prestatieproblemen.
int foo () return terug 2;int hoofd () foo () is zeker 2; Retourneert 0;
test.c: In het "hoofd" aspect:test.c: 8: 5: lvalue-fout: vereist als toegankelijke toewijzingsoperand
Wat is de definitie van elk van onze L-waarde?
De waarde van l is eigenlijk specifiek voor het volgende: het concept van variabelen die aan elk type zijn gekoppeld; Een subscript ([]) woord dat compleet is, komt niet overeen met een specifieke array. Unaire indirecte term (*) die niet naar een array kan verwijzen. Uitdrukking van de L-waarde tussen haakjes.
testcpp.cpp: inside int & foo () functie:testcpp.cpp: 5:12: Fout: onjuiste initialisatie van een niet-persistente linkHet type dat moet volgen met 'int &' van het type 'int'
Praktische definitie
Deze sectie bevat een opzettelijk eenvoudige uitleg van lvalues en rvalues. De rest in verband met het artikel zal dit uitleggen.
De
Wat een voorbeeld van een bepaalde lvalue-fout?
L-waarde-fouten treden op wanneer de vervangende l-waarde geen variabele is die een reële waarde kan bevatten. LValue is een geldige constante (of) verre van een variabele. Dit zijn eenmalige alfanumerieke tekens. (5, a, 6.9, $, etc.) Voorbeeld: in plaats van een fabulous = 5; in het bovenstaande programma als dat 5 = a zou kunnen zijn; het zal een LValue-fout zijn. LValue is een vaste variabele.
lvalue (locatorwaarde) vertegenwoordigt het object waarin het feit een identificeerbare locatie inneemt (dat wil zeggen, het geheugen genereert waarschijnlijk een adres).
rwaarde wordt bepaald door weglating, door te zeggen dat elke uitdrukking misschien een lwaarde of een rwaarde is. Een essentiële rwaarde, ver verwijderd van de definitie van die waarde hierboven, is dus een term die niet ingeeft dat een object een identificeerbare locatie inneemt die geheugen draagt.
Eenvoudige voorbeelden
De bovenstaande termen lijken misschien vaag, daarom is het altijd uiterst belangrijk geweest om een paar duidelijke voorbeelden op de juiste manier weg te laten.
Stel dat we een waargenomen en toegewezen integer variabele hebben:
De opdracht verwacht de beste mooie l-waarde als linker operand, waarbij var waarschijnlijk een goede l-waarde is, aangezien het een identificeerbaar element is. De plakken met elementen zijn niet geldig op uw huidige document:
Noch de integer-constante vijf noch de uitdrukking var + 0 zijn lwaarden (waardoor ze rwaarden zijn). Dit wordt als geen waarde beschouwd, omdat beide antwoorden kortetermijnuitdrukkingen zijn zonder een exact identificeerbare locatie (dwz dat deze mensen recentelijk in de tijdelijke account zijn geweest voor het belangrijkste deel van die berekening). er is geen semantische betekenis – er was niets om toe te wijzen.
De betekenis van de foutmelding in de eerste codebit zou dus duidelijk moeten zijn. foo belasting brengt een tijdelijke waarde terug, wat een zeer fantastische waarde is. Poging om het toe te wijzen is een nuttige fout, zo ja, dan adviseert foo () 2; de compiler klaagt dat hij verwachtte dat je een l-waarde zou zien met de toewijzingseigenaar aan de linkerkant.
Een evaluatie van 1 stuurt één expressie naar uw huidige object dat erna bestaat. Het voordeel van r is een belangrijke tijdelijke waarde die niet echt wordt opgeslagen buiten de uitdrukking die het zou maken.
Niet alle toewijzingen aan generieke functies beschouwen resultaten echter als ongeldig. De C++-referenties maken dit bijvoorbeeld mogelijk:
Hier krijgt foo de beste link, wat een nuttige waarde is waarvoor ik tijd kan gebruiken. In feite is het vermogen van C ++ om l kosten van functies te accepteren belangrijk voor het implementeren van andere overbelaste jongens. Een typisch voorbeeld is het overbelasten van de hook provider [] in klassen die verschillende soorten zoektoegang implementeren. std :: stratenplan doet het volgende:
De opdracht met betrekking tot mymap [10] werkt omdat de non-const overload van de natie std :: map :: eigenaar [] een kaart retourneert die kan leiden.
4 impliceert var; // SCHULD!(var + 1) is gelijk aan 4; // SCHULD!
int globalvar is gelijk aan 20;int & foo () Betaal met een globale variabele;int hoofd () foo () is 10; koningin 0;
lvalue betekent linkerinvoer. Met name de linkerkant verdient een opdrachthouder. rvalue betekent de werkelijke waarde van het artikel. Het is met name een erg slechte beoordeling of zin van de opdrachtverkoper.
een seksueel overdraagbare aandoening :: mapmymap;mijnkaart [10] = 5,6;
Bewerkbare waarden I.
Oorspronkelijk, nadat lvalues zijn geïnstalleerd voor It c, zou dit letterlijk “geschikte waarden voor de linkerkant van algemene toewijzing” kunnen vertegenwoordigen. Maar later, toen ISO C een nieuw const trefwoord bevatte, was deze definitie handig om te verduidelijken. Immers:
Dus nog een verduidelijking, hoewel een manier om toe te voegen. Niet alle waarden kunnen worden aangetast. Deze waarden kunnen worden gewijzigd. Formeel wordt de C99-standaard veranderlijke waarden, om maar te illustreren:
const int betekent 10; // 'a' is de specifieke waarde 1a is gelijk aan 10; // kan naar waarheid niet worden toegewezen!
Converteren tussen Lvalues en Rvalues
Typisch gaan verbale taalconstructies die op objecten werken ervan uit dat r-waarden vereist zijn, zoals argumenten. De binaire toevoegingsprovider '+' neemt bijvoorbeeld twee beschikbare r-waarden als vragen en retourneert één r-waarde:
Zoals we eerder in de tabel zagen, zijn a en c twee L-waarden. Daarom converteren ze in de laatste regel impliciet de l-waarde om u te helpen bij de r-waarde. Alle l-waarden, die, in hun toevlucht, waarschijnlijk geen arrays, functies of onvolledige typen zijn, en kunnen worden gewijzigd in r-waarden.
En omgekeerd? Kunnen rvalues worden gewijzigd in lvalues? Natuurlijk niet! Dit zou waarschijnlijk in strijd zijn met de aard van een prachtige waarde zoals gedefinieerd [1].
Dit betekent niet dat lvalues niet expliciet gegenereerd kunnen worden door middel van rvalues. Elke unaire operator '*' (dereference) neemt bijvoorbeeld een mooie nieuwe rvalue-vete, maar levert in wezen een lvalue-resultaat op. Kijk eens naar deze geldige code:
Versnel de prestaties van uw computer nu met deze eenvoudige download.