#include<iostream>
using namespace std;
int &fun()
{
static int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
Function fun() is returning value by reference but in main() method I am assigning some int to function. Ideally, a compiler should show an error like lvalue required but in above case the program works fine. Why is it so?
It's loose and sloppy language to say "a function returns something". It's OK as a shorthand if you know how to work with that, but in this case you get confused.
The more correct way to think about it is that you evaluate a function call expression. Doing that gives you a value. A value is either an rvalue or an lvalue (modulo details).
When T
is an object type and you evaluate a function that has return type T
, you get a value of type T
which is an rvalue. On the other hand, if the function has return type T &
, you get a value of type T
which is an lvalue (and the value is the thing bound to the reference in the return
statement).
Returning a reference is quite useful.
For example it's what std::map::operator[]
does. And I hope you like the possibility of writing my_map[key] = new_value;
.
If a regular (non-operator) function returns a reference then it's ok to assign to it and I don't see any reason for which this should be forbidden.
You can prevent assignment by returning a const X&
or by returning X
instead if you really want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With