What is lvalue and rvalue

Last updated: April 1, 2026

Quick Answer: Lvalues and rvalues are C++ concepts: lvalues are expressions with persistent memory addresses you can reference with &, while rvalues are temporary expressions without persistent addresses that exist only for evaluation.

Key Facts

Lvalues and Rvalues Explained

Lvalues and rvalues are fundamental C++ concepts describing value categories and where expressions reside in memory. An lvalue is an expression that refers to an object with a persistent memory address that you can take with the address-of operator (&). An rvalue is an expression that evaluates to a temporary value without a persistent address you can reference.

Lvalue Characteristics

Lvalues include variables, object members, array elements, and anything you can take the address of. For example, int x = 5; makes x an lvalue because it has a persistent memory location. Lvalues persist beyond the current expression and can appear on either side of assignment operators: x = 10; or y = x;.

Rvalue Characteristics

Rvalues include temporary values, literals, and results of operations. For example, int y = x + 5; produces an rvalue from the addition operation. Rvalues exist only for expression evaluation and cannot appear on the left side of assignment. You cannot take the address of an rvalue.

References and Move Semantics

Lvalue references (declared with &) bind to lvalues: int& ref = x;. Rvalue references (declared with &&) bind to rvalues: int&& ref = x + 5;. C++11 introduced rvalue references to enable move semantics, allowing efficient transfer of ownership of resources like memory or file handles without copying.

Practical Applications

Understanding lvalues and rvalues is essential for writing efficient modern C++ code. Move constructors and move assignment operators exploit rvalue references to avoid unnecessary copying. Standard library functions like std::move() cast lvalues to rvalues, enabling move semantics in generic code. This distinction powers optimization techniques that make C++ performant for resource-intensive applications.

Related Questions

What is the difference between lvalue and rvalue references?

Lvalue references (&) bind to lvalues with persistent addresses, while rvalue references (&&) bind to temporary rvalues. Rvalue references enable move semantics for efficient resource transfer.

What is move semantics in C++?

Move semantics is a C++11 feature that transfers resources from temporary objects to permanent ones instead of copying them, dramatically improving performance by avoiding expensive memory duplication operations.

How are move semantics related to rvalues?

Move semantics use rvalue references to detect temporary objects and efficiently transfer ownership of their resources. Move constructors and move assignment operators accept rvalue references to implement this optimization.

What are references in C++?

References are aliases to existing variables that provide another name for the same memory location, allowing pass-by-reference function parameters and rvalue references for move operations.

Can you give examples of lvalues and rvalues?

Lvalues: variables (x), object members (obj.member), array elements (arr[0]). Rvalues: literals (5, "hello"), function returns producing temporaries, results of arithmetic operations (x+y).

Why does understanding lvalues matter for performance?

Understanding lvalues and rvalues helps you write efficient code by allowing the compiler to optimize resource management, particularly through move semantics that eliminate unnecessary copying of large objects.

Sources

  1. cppreference - Value Categories CC-BY-SA-3.0
  2. Value Semantics - Wikipedia CC-BY-SA-4.0
  3. C++ Standards Committee ISO