Archived

This topic is now archived and is closed to further replies.

PredeX

lvalues & rvalues

Recommended Posts

I read a couple of information on what lvalues & rvalues are, but IMHO those article contradicted each other in one or the other way (or I just didn''t get it...) Could someone explain that to me or give me a link where I can look that up?? Thx PredeX

Share this post


Link to post
Share on other sites
I think that lvalue means "read-write" and rvalue means "write-only." It is basically a compiler convention that prevents you from doing stupid stuff, such as:

class someclass
{
bool block_;

public:
bool block() { return block_; }
};

int main()
{
someclass someinstance;
someinstance.block() = true; // error: not an lvalue
}


Since someclass::block() is a function that returns its data member by value, the returned object is merely a temporary; setting it to true is meaningless because the temporary goes out of scope immediately after the assignment. The compiler will raise hell about this because it will prevent you from making stupid mistakes.

Gotta go now, or I''d polish this up a bit. Maybe someone else can elaborate on this.

- null_pointer

Share this post


Link to post
Share on other sites
From MSDN: (why don't people ever use it)

L-Values and R-Values
Expressions in C++ can evaluate to “l-values” or “r-values.” L-values are expressions that evaluate to a type other than void and that designate a variable.

L-values appear on the left side of an assignment statement (hence the “l” in l-value). Variables that would normally be l-values can be made nonmodifiable by using the const keyword; these cannot appear on the left of an assignment statement. Reference types are always l-values.

The term r-value is sometimes used to describe the value of an expression and to distinguish it from an l-value. All l-values are r-values but not all r-values are l-values.

Some examples of correct and incorrect usages are:

    
i = 7; // Correct. A variable name, i, is an l-value.

7 = i; // Error. A constant, 7, is an r-value.

j * 4 = 7; // Error. The expression j * 4 yields an r-value.

*p = i; // Correct. A dereferenced pointer is an l-value.

const int ci = 7; // Declare a const variable.

ci = 9; // ci is a nonmodifiable l-value, so the

// assignment causes an error message to

// be generated.

((i < 3) ? i : j) = 7; // Correct. Conditional operator (? :)

// returns an l-value.



Edited by - siaspete on December 16, 2001 10:40:28 AM

Share this post


Link to post
Share on other sites