@wallhackio Rvalue is the stuff that can be on the right side of an assignment, right? Assignment is lvalue = rvalue;
. So lvalue
must be something that exists in memory, while an rvalue
can also be an expression, such as 3 + 2
or a + 2
or f(x*y*z)
.
Simple enough, it's same as in C.
And then C++ does some sorcery with two ampersands &&
, I forgot what that does...
@vaporeon_ in C++ the left value/right value definition used to be mostly correct (it's not exactly right) but the 2011 update to the specification fucked everything
@vaporeon_ I'll get back to you later this evening 🫡
@vaporeon_ I forgot to mention that, to access the hastebin, you need to enter The Truth as a password (clodsireisawhale)
@vaporeon_ Before the 2011 update to the C++ specification, lvalues and rvalues could have been thought of as "addressable expressions" and "temporary expressions", respectively. Any expression whose value was stored in an address in memory that was made available to the programmer was an lvalue ("addressable expressions") while expressions that cannot be accessible in subsequent lines of code (say, a + b = 3 in an if statement; the result of a + b can't be used again in any context other than the if statement) were referred to as rvalues ("temporary expressions").
Note that when we say that a value is addressable we mean that it is addressable from the programmer's point of view. Many rvalue expressions have results that must be stored somewhere (a function call which returns an object is an rvalue, for example) but if the programmer cannot access that address with the & operator then it is is not an lvalue in the pre-2011 C++ standard.
But the introduction of the rvalue reference cast in C++11, used to enable move semantics, created an expression that does not fit neatly into the old lvalue/rvalue dichotomy. Casting an object into an rvalue reference is a temporary value (if I don't store it in a variable the result of the cast won't be accessible in subsequent lines of code) but since it is a reference it is an explicit address in memory that is made available to the programmer. The C++ standards committee resolved this problem by introducing a third value category and changing the meaning of the word "rvalue":
There also exists the less useful umbrella term glvalue, short for "general lvalue", which refers to either xvalues or lvalues. The new term xvalue was originally introduced without any meaning and has been retroactively defined in the standard as being short for "eXpiring value". I prefer to think of xvalue as being short for "cross value" since an xvalue contains a cross of some characteristics from lvalues and some characteristics from prvalues.
There are many details I'm leaving out, here is a "pastebin" containing additional notes I left out of what I wrote here: https://hastebin.com/share/feqoyilaqo.vbnet