What is lvalue and rvalue
Last updated: April 1, 2026
Key Facts
- Lvalues can appear on both left and right sides of assignment operators
- Rvalues can only appear on the right side of assignment operators
- Lvalue references (&) bind to lvalues; rvalue references (&&) bind to rvalues
- Rvalue references enable move semantics for efficient resource management
- Understanding lvalues and rvalues is critical for modern C++11 and later programming
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.
More What Is in Daily Life
Also in Daily Life
More "What Is" Questions
Trending on WhatAnswers
Browse by Topic
Browse by Question Type
Sources
- cppreference - Value CategoriesCC-BY-SA-3.0
- Value Semantics - WikipediaCC-BY-SA-4.0
- C++ Standards CommitteeISO