Under de senaste dagarna har några av enskilda läsare informerat oss om att de har upptäckt ett värdefel på 1.
Godkänd: Fortect
Detta fel faller när vi sätter konstanter till vänster om operatorn = och variabler till suiten. Så de tar arr som adressen liksom stoppsidan är konstant, så hela felet kommer med största sannolikhet att visas som det erforderliga L-värdet.
ArchnzacDen används som en valfri tidsvariabel och indikerar ett användbart fel som uppstod under ett funktionsanrop. Du kan hitta många felkoder i
“lvalue” är en önskad uppgift. “L” står för vänster, eftersom den oönskade vänstern är en symbol. Rvärde är det korrekta vapenvärdet och genererar ett värde som inte kan utöver det inte kan tilldelas direkt. Om du får 1 “lvalue required”, har den personen ett uttryck där returnerar ett rvalue när ett lvalue förutsägs.
För modellen är en konstant ofta ett r-värde, men inte ett l-värde för vissa. Så:
1 = 2; // Inte välutbildad, värdesätter uppdragint i; (i + 1) ska vara 2; // Felaktigt format kommer rvalue att bli bolgreat värde.
int i;i = 2;
Gör det. Observera att du kan returnera detta lvärde från en funktion; Till exempel kan du säkert få en referens till ett objekt som använder operatorn = ().
Som Pavel Minaev påpekade i kommentarerna är detta inte den vanliga definitionen av lvärden och rvärden på en persons respektive språk, utan snarare ett försök att återvända för att informera någon som har en bugg i implementeringen av rvärden och där ett lvärde anses att du helt enkelt nödvändigt kriterium. C ++ är en språkverklighet med dess många detaljer; Om du vill att det skulle komma officiellt måste du kontakta en auktoriserad medarbetare.
Etiketterna lvalue och rvalue är inte vanligt förekommande i C/C++-programmering, men när du erbjuder är deras betydelse vanligtvis inte direkt uppenbar. Oftast ingår dessa termer i kompilatorfel och även varningsmeddelanden. Kompileringsexempel om du tittar med gcc :
Det stämmer, specifik kod är till sin natur kinky och inte vad du skulle skriva, men som lvalue error-projektet nämner, är det en term som ofta finns i hela C/C++ tutorials. Ett annat exempel är utan tvekan att kompilera detta lösenord med k ++ :
Här är felet återigen relaterat till det kryptiska rvärdet. Så vad är att utföra lvalue rvalue mean i C och C ++? Detta är vad jag vill utforska i den här vägledningsartikeln.
Godkänd: Fortect
Fortect är världens mest populära och effektiva PC-reparationsverktyg. Det litar på miljontals människor för att hålla sina system igång snabbt, smidigt och felfritt. Med sitt enkla användargränssnitt och kraftfulla skanningsmotor hittar och fixar Fortect snabbt ett brett utbud av Windows-problem – från systeminstabilitet och säkerhetsproblem till minneshantering och prestandaflaskhalsar.
int foo () turn back 2;int main () foo () kan vara 2; Returnerar 0;
test.c: I den "huvudsakliga" aspekten:test.c: 8: 5: lvalue error: involverad som en tillgänglig uppdragsoperand
Vad är definitionen av L-värdet?
Värdet på l är faktiskt ett som gäller följande: konceptet med variabler av nästan alla typer; Ett nedsänkt ([]) ord som inte bara matchar en specifik matris. Unär indirekt mening (*) som inte kan referera till en array. Uttryck för L-värdet inom parentes.
testcpp.cpp: bär int & foo () funktion:testcpp.cpp: 5:12: Fel: Felaktig initiering av en icke-beständig länkTypen att göra av 'int &' av typen 'int'
Praktisk definition
Det här avsnittet innehåller en avsiktligt förenklad slutsats av lvärden och rvärden. Resten av hur artikeln kommer att förklara detta.
Som är en exempel på bra lvärdefel?
Lvärdefel uppstår när det nya lvärdet helt enkelt inte är en variabel som kan innehålla ett belopp. LValue är en giltig konstant (eller) inte en ny variabel. Dessa är alfanumeriska engångstecken. (5, en, 6,9, $, etc.) Exempel: istället för a är lika med 5; i programmet ovan om det mycket möjligt kan vara 5 = a; det kommer att vara bra LValue-fel. LValue är en konstant variabel.
lvalue (lokaliseringsvärde) representerar objektet där du ser, faktumet upptar en identifierbar plats (det vill säga minnen genererar en adress).
rvalue definieras som utelämnande, vilket säger att varje uttryck antingen är ett nytt lvärde eller ett rvärde. Således är ett skrymmande rvärde, långt ifrån definitionen av ett lvärde över, en term som inte betyder att ett objekt upptar en identifierbar plats som transporterar minne.
Enkla exempel
Termerna precis ovan kan tyckas vaga, så det är mycket viktigt att utelämna några enkla goda.
Anta att vi har en uppfattad och tillhandahållen heltalsvariabel:
Tilldelningen förväntar sig ett fantastiskt lvärde som sin vänstra operand, och var är sannolikt ett lvärde, förutsatt att det är ett identifierbart element. Följande föreningar är inte giltiga på din nuvarande sida:
Varken heltalskonstanten 4 eller uttrycket var + 1 verkar vara lvärden (vilket gör dem till rvärden). Detta är och aldrig ett lvärde, eftersom båda svaren är tillfälliga ord utan en exakt identifierbar plats (dvs. de har kanske nyligen funnits i det tillfälliga registret under den viktigaste delen av beräkningen). Det finns också ingen semantisk betydelse – det finns ingenstans att tilldela.
Därför kan innebörden av alla felmeddelanden i det första kodavsnittet vara tydlig. foo skattedeklarationer ett viktigt tillfälligt värde, vilket är ett mycket professionellt värde. Att försöka tilldela det är ett fantastiskt fel, i så fall innebär foo () 2; din kompilator klagar på att den förväntade dig att du skulle se ett lvärde med tilldelningsoperatören av vänster.
En utvärdering av 1 skickar ett uttryck till målet som finns efter det. r-värdet är vanligtvis ett viktigt temporärt värde som inte sätts utanför uttrycket som använder det.
Men inte alla mappningar till goda resultat för generiska funktionsanrop är ogiltiga. Till exempel, C ++-bevisen gör detta möjligt:
Här får foo en associerad, vilket är ett användbart värde I till dem som den kan tilldelas. Faktum är att C ++s förmåga att acceptera l-värden från attribut är viktig för att implementera andra överbelastade operatörer. Ett typiskt exempel är överbelastning av hook-grundaren [] i klasser som implementerar någon kategori av sökåtkomst. std :: google map gör följande:
Uppgiften relaterad till mymap [10] fungerar eftersom dess icke-konst överstock std :: map :: operator [] kommer tillbaka en karta som kan tilldelas .
ett par antyder var; // SKYLD!(var + 1) innebär 4; // SKYLD!
int globalvar = 20;int & foo () Betala för en viktig global variabel;int main () foo () är 10; kung 0;
lvärde betyder vänster ingång. I själva verket förtjänar den vänstra sidan en uppdragsoperatör. rvalue resurser sidans sanna värde. Framför allt är det ett riktigt dåligt betyg utöver fras från uppdragssäljaren.
std :: google mapmymap;mymap [10] = 5,6;
Redigerbara värden I.
Ursprungligen, efter att lvalues specificerades för It c, kunde detta bokstavligen leda till “lämpliga värden för den vänstra sidan av ofta tilldelningen.” Men senare, när ISO C innehöll vårt eget const nyckelord, var denna definition tvungen att förtydligas. När allt kommer omkring:
Så, ytterligare ett förtydligande som det speciella sättet att lägga till. Alla lvärden kan inte påverkas. Dessa värden kan ändras. Formellt blir din nuvarande C99-standard föränderliga värden, till exempel:
const int betyder 10; // 'a' är affären 1a är lika med 10; // men kan inte tilldelas!
Konvertering mellan L-värden och R-värden
Vanligtvis antar verbala språkkonstruktioner som fungerar ovanpå objekt att rvärden krävs som fejder. Till exempel tar den binära additionsoperatorn '+' två tillgängliga rvärden som argument och returnerar därför ett rvärde:
Som vi sett hittills kan a och b vara två L-värden. Därför, i den tredje typen, omvandlar de implicit l-värdet till det faktiska r-värdet. Alla l-värden, som i sin tur inte borde vara det, är arrayer, syften eller ofullständiga typer och kan konverteras till rvalues.
Och vice versa? Kan rvärden ändras till lvärden? Självklart inte! Detta bör vanligtvis bryta mot naturen hos ett exceptionellt lvärde enligt definitionen [1].
Detta leder inte till att lvärden inte kan genereras uttryckligen tillhandahållna av rvärden. Till exempel, vilken unär operator '*' (dereference) tar ett trevligt nytt rvalue-argument, men ger tyvärr i huvudsak ett lvalue-resultat. Ta en titt på den här giltiga koden:
Snabba upp din dators prestanda nu med denna enkla nedladdning.