Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assigning value to function returning reference

#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?

like image 874
username_4567 Avatar asked Sep 23 '13 16:09

username_4567


2 Answers

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).

like image 119
Kerrek SB Avatar answered Nov 14 '22 20:11

Kerrek SB


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.

like image 29
6502 Avatar answered Nov 14 '22 21:11

6502