In CeePlusPlus, the way one has a function return a LeftValue is by ReturningReferences. This is necessary to implement OperatorOverloading properly; OTOH this feature has some issues with it which make it ConsideredHarmful by some.
template <class T> class myArray
{
// buncha stuff not important for this example
// need to support []
T &operator [] (int index);
// and for const arrays
const T &operator [] (int index) const;
// more
},;
In the first case, since "operator []" is declared to return a reference to T, the result can be used as a LeftValue, i.e.
intArray a;
a[0] = 1;
a[1] = 2;
cout << a[0] << "\n";
cout << a[1] << "\n";
As expected, this program fragment prints
1
2
on the standard output.
ReturningReferences has quite a few issues with it, which put it firmly in the category of "use only if you know what you are doing".
- It is a common newbie error to return references to automatic variables.
int &bad (void)
{
int a = 0;
return a;
},
// some other function
cout << bad();
Were we to abandon the reference type and use pointers, the equivalent C code would be
int *bad(void)
{
int a = 0;
return &a;
},
/* some other function */
printf ("%d\n", *(bad()));
In both cases, a pointer to the returning function's stack frame is returned--in other words, a WildPointer.