Delen via


Lvalues en Rvalues (C++)

Elke C++-expressie heeft een type en behoort tot een waardecategorie. De waardecategorieën vormen de basis voor regels die compilers moeten volgen bij het maken, kopiëren en verplaatsen van tijdelijke objecten tijdens de evaluatie van expressies.

De C++17-standaard definieert als volgt expressiewaardecategorieën:

  • Een glvalue is een expressie waarvan de evaluatie de identiteit van een object, bitveld of functie bepaalt.
  • Een prvalue is een expressie waarvan de evaluatie een object of een bitveld initialiseert, of berekent de waarde van de operand van een operator, zoals opgegeven door de context waarin deze wordt weergegeven.
  • Een xvalue is een glvalue die een object of bitveld aangeeft waarvan de resources opnieuw kunnen worden gebruikt (meestal omdat deze zich aan het einde van de levensduur bevindt). Voorbeeld: Bepaalde soorten expressies met betrekking tot rvalueverwijzingen (8.3.2) leveren xwaarden op, zoals een aanroep naar een functie waarvan het retourtype een rvalue-verwijzing is of een cast naar een rvalue-verwijzingstype.
  • Een lvalue is een glvalue die geen xvalue is.
  • Een rvalue is een prvalue of een xvalue.

In het volgende diagram ziet u de relaties tussen de categorieën:

Diagram van C++-expressiewaardecategorieën.

Het diagram begint met een expressie met het label box, met twee onderliggende elementen: glvalue en rvalue. glvalue heeft twee kinderen: lvalue en xvalue. rvalue heeft twee onderliggende elementen: prvalue en xvalue; xvalue is ook een onderliggend element van glvalue.

Een lvalue heeft een adres waartoe uw programma toegang heeft. Voorbeelden van lvalue-expressies zijn namen van variabelen, waaronder const variabelen, matrixelementen, functieaanroepen die een lvalue-verwijzing, bitvelden, samenvoegingen en klasseleden retourneren.

Een prvalue-expressie heeft geen adres dat toegankelijk is voor uw programma. Voorbeelden van prvalue-expressies zijn letterlijke waarden, functieaanroepen die een niet-deductietype retourneren en tijdelijke objecten die tijdens de evaluatie van expressies worden gemaakt, maar alleen toegankelijk zijn voor de compiler.

Een xvalue-expressie heeft een adres dat niet meer toegankelijk is voor uw programma, maar kan worden gebruikt om een rvalue-verwijzing te initialiseren, die toegang biedt tot de expressie. Voorbeelden hiervan zijn functieaanroepen die een rvalue-verwijzing retourneren, en de subscripts, leden en pointers naar lid-expressies waarbij de array of het object een rvalue-verwijzing is.

Example

In het volgende voorbeeld ziet u verschillende juiste en onjuiste gebruikswaarden van lvalues en rvalues:

// lvalues_and_rvalues2.cpp
int main()
{
    int i, j, *p;

    // Correct usage: the variable i is an lvalue and the literal 7 is a prvalue.
    i = 7;

    // Incorrect usage: The left operand must be an lvalue (C2106).`j * 4` is a prvalue.
    7 = i; // C2106
    j * 4 = 7; // C2106

    // Correct usage: the dereferenced pointer is an lvalue.
    *p = i;

    // Correct usage: the conditional operator returns an lvalue.
    ((i < 3) ? i : j) = 7;

    // Incorrect usage: the constant ci is a non-modifiable lvalue (C3892).
    const int ci = 7;
    ci = 9; // C3892
}

Note

De voorbeelden in dit onderwerp illustreren het juiste en onjuiste gebruik wanneer operators niet overbelast zijn. Door operatoren te overbelasten, kunt u een expressie zoals j * 4 een lvalue maken.

De termen lvalue en rvalue worden vaak gebruikt wanneer u naar objectverwijzingen verwijst. Zie Lvalue Reference Declarator: & en Rvalue Reference Declarator: && voor meer informatie over verwijzingen.

Zie ook

Basisconcepten
Lvalue Reference Declarator: &
Rvalue Reference Declarator: &&