Sdílet prostřednictvím


Hodnoty Lvalue a Rvalue (C++)

Každý výraz jazyka C++ má typ a patří do kategorie hodnot. Kategorie hodnot jsou základem pravidel, která kompilátory musí dodržovat při vytváření, kopírování a přesouvání dočasných objektů během vyhodnocení výrazu.

Standard C++17 definuje kategorie hodnot výrazů následujícím způsobem:

  • Hodnota glvalue je výraz, jehož vyhodnocení určuje identitu objektu, bitového pole nebo funkce.
  • Hodnota prvalue je výraz, jehož vyhodnocení inicializuje objekt nebo bitové pole, nebo vypočítá hodnotu operandu operátoru, jak je určeno kontextem, ve kterém se zobrazí.
  • Hodnota xvalue je glvalue, která označuje objekt nebo bitové pole, jehož prostředky je možné znovu použít (obvykle proto, že se blíží konci životnosti). Příklad: Některé druhy výrazů zahrnujících odkazy rvalue (8.3.2) vrací hodnoty x, například volání funkce, jejíž návratový typ je odkaz rvalue nebo přetypování na typ odkazu rvalue.
  • Hodnota lvalue je glvalue, která není hodnotou x.
  • Rvalue je hodnota prvalue nebo xvalue.

Následující diagram znázorňuje vztahy mezi kategoriemi:

Diagram of C++ expression value categories.

Diagram začíná výrazem označeným rámečkem, který má dvě podřízené položky: glvalue a rvalue. Hodnota glvalue má dvě podřízené položky: lvalue a xvalue. rvalue má dvě podřízené položky: prvalue a xvalue; hodnota xvalue je také podřízená hodnota glvalue.

Hodnota má adresu, ke které má váš program přístup. Mezi příklady výrazů lvalue patří názvy proměnných, včetně const proměnných, prvků pole, volání funkce, která vracejí odkaz lvalue, bitová pole, sjednocení a členy třídy.

Výraz prvalue nemá žádnou adresu, která je přístupná programem. Mezi příklady výrazů prvalue patří literály, volání funkcí, která vracejí typ nonreference, a dočasné objekty, které jsou vytvořeny během vyhodnocení výrazu, ale přístupné pouze kompilátorem.

Výraz xvalue má adresu, která již není přístupná programem, ale lze ji použít k inicializaci odkazu rvalue, který poskytuje přístup k výrazu. Mezi příklady patří volání funkcí, která vracejí odkaz na hodnotu rvalue, a maticový dolní index, člen a ukazatel na členské výrazy, kde pole nebo objekt je odkaz rvalue.

Příklad

Následující příklad ukazuje několik správných a nesprávných použití l-hodnot a r-hodnot:

// 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
}

Poznámka:

Příklady v tomto tématu ukazují správné a nesprávné použití v případě, že operátory nejsou přetíženy. Přetěžováním operátorů lze vytvořit výraz jako l-hodnotu j * 4.

Termíny lvalue a rvalue se často používají při odkazech na objekty. Další informace o odkazech naleznete v tématu Deklarátor odkazů Lvalue: &Rvalue Reference deklarátor: &&.

Viz také

Základní koncepty
Deklarátor odkazu l-hodnoty: &
Deklarátor odkazu r-hodnoty: &&