Could someone please explain how to simulate this error? and also what this complains about.
"A non-const reference may only be bound to an lvalue" in C++
Could someone please explain how to simulate this error? and also what this complains about.
"A non-const reference may only be bound to an lvalue" in C++
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.
void increment(long &i) { ++i; }
would ruin your day then point and laugh if you accidentally put the name of an int
variable as the argument. However, if type X converts to type Y, and type Y has a non-const member function increment
, there is no equivalent danger of you writing X x; x.increment();
and then wondering why x
was unchanged. –
Osbourne std::ofstream("filename") << "hello\n"
is allowed, but std::ofstream("filename") << Foo();
arbitrarily isn't, since the relevant operator<<
must be a non-member. –
Osbourne It means you can't do something like this:
void foo(int &x) { ... }
int bar() { ... }
foo(bar());
You would need to make foo
take a const
reference, or assign the result of bar()
to a variable, and then pass that into into foo
.
© 2022 - 2024 — McMap. All rights reserved.