An lvalue is, roughly, whatever may be on the left side of an assignment statement. References provide aliases for other objects:
std::string s;
std::string & rs = s; // a non-const reference to s
std::string const & crs = s; // a const reference to s
Given the above definitions, referring to rs
or crs
is the same as referring to s
, except that you cannot modify the referred string through crs
, as it is const. A variable is an lvalue, so you are allowed to bind a non const reference to it. In contrast you can bind const references to temporary values as in:
std::string const & crs1 = std::string();
However the following is illegal:
std::string & rs1 = std::string();
This is because using non-const references you imply that you want to modify the referenced object. However temporaries bound to references are destroyed when the reference go out of scope. As it is not always intuitive when C++ creates temporary objects, binding them to non-const references has been disallowed, to avoid you the unpleasant surprise of changing your object as you like, just to see it destroyed a few statements later.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…