[conv.lval] (original) (raw)
7 Expressions [expr]
7.3 Standard conversions [conv]
7.3.2 Lvalue-to-rvalue conversion [conv.lval]
A glvalue of a non-function, non-array type Tcan be converted to a prvalue.43
If T is an incomplete type, a program that necessitates this conversion is ill-formed.
If Tis a non-class type, the type of the prvalue is the cv-unqualified version of T.
Otherwise, the type of the prvalue is T.44
When an lvalue-to-rvalue conversion is applied to an expression E, and either
- E is not potentially evaluated, or
- the evaluation of E results in the evaluation of a member of the set of potential results of E, and names a variable x that is not odr-used by ([basic.def.odr]),
the value contained in the referenced object is not accessed.
[Example 1: struct S { int n; };auto f() {S x { 1 };constexpr S y { 2 };return [&](bool b) { return (b ? y : x).n; };} auto g = f();int m = g(false); int n = g(true); — _end example_]
The result of the conversion is determined according to the following rules:
- If T is cv std::nullptr_t, the result is a null pointer constant ([conv.ptr]).
[Note 1:
Since the conversion does not access the object to which the glvalue refers, there is no side effect even if T is volatile-qualified ([intro.execution]), and the glvalue can refer to an inactive member of a union ([class.union]).
— _end note_] - Otherwise, if T has a class type, the conversion copy-initializes the result object from the glvalue.
- Otherwise, if the object to which the glvalue refers contains an invalid pointer value ([basic.compound]), the behavior isimplementation-defined.
- Otherwise, if the bits in the value representation of the object to which the glvalue refers are not valid for the object's type, the behavior is undefined.
[Example 2: bool f() { bool b = true;char c = 42; memcpy(&b, &c, 1);return b; } — _end example_] - Otherwise, the object indicated by the glvalue is read ([defns.access]).
Let V be the value contained in the object.
If T is an integer type, the prvalue result is the value of type T congruent ([basic.fundamental]) to V, andV otherwise.