// Reference als return type

#include <iostream>
using namespace std;

int& max(int& a, int& b) {
	if (a>b) return a;
	else return b;
}

#ifndef __BORLANDC__
// DE ONDERSTAANDE CODE IS NIET CORRECT !!! DANGLING REFERENCE
// Borland C++ Builder 6 herkend deze fout
// GNU gcc geeft alleen een warning
// Visual C++ geeft alleen een warning
int& som1(int i1, int i2) { // Een gemene fout
	int s=i1+i2;
	return s;
//	Error (Borland):      Attempting to return a reference to local variable 's'
//	Warning (gcc):        reference to local variable `s' returned
//	Warning (Visual C++): returning address of local variable or temporary
}
#endif

// DE ONDERSTAANDE CODE IS NIET CORRECT !!! DANGLING POINTER
// Borland C++ Builder 6 geeft alleen maar een waarschuwing
// GNU gcc geeft alleen een warning
// Visual C++ geeft alleen een warning
int* som2(int i1, int i2) { // Een gemene fout
	int s=i1+i2;
	return &s;
//	Warning (Borland):    Suspicious pointer conversion
//	Warning (gcc):        address of local variable `s' returned
//	Warning (Visual C++): returning address of local variable or temporary
}

// Dit is de juiste manier om de waarde van een lokale variabele terug te geven
int som3(int i1, int i2) {
	int s=i1+i2;
	return s;
}

void doewat(int i) {
	for (int j=0; j<i; ++j)
		cout<<"Bla ";
	cout<<endl;
}

int main() {
	int x(3), y(4);
	cout<<"x = "<<x<<" y = "<<y<<endl;
	max(x,y)=2;	// y is nu 2
	cout<<"x = "<<x<<" y = "<<y<<endl;
	max(x,y)++;	// x is nu 4
	cout<<"x = "<<x<<" y = "<<y<<endl;

#ifndef __BORLANDC__
	int& z1=som1(1, 2);
	doewat(3);
	cout<<"1 + 2 = "<<z1<<endl;
	z1=som1(som1(1, 2), som1(3, 4));
#endif

	int* z2=som2(1, 2);
	doewat(3);
	cout<<"1 + 2 = "<<*z2<<endl;

	int z3=som3(1, 2);
	doewat(3);
	cout<<"1 + 2 = "<<z3<<endl;

	cin.get();
	return 0;
}

/* Uitvoer (Borland):
x = 3 y = 4
x = 3 y = 2
x = 4 y = 2
Bla Bla Bla
1 + 2 = 4199928
Bla Bla Bla
1 + 2 = 3
*/

/* Uitvoer (gcc):
x = 3 y = 4
x = 3 y = 2
x = 4 y = 2
Bla Bla Bla
1 + 2 = 0
Bla Bla Bla
1 + 2 = 0
Bla Bla Bla
1 + 2 = 3
*/

/* Uitvoer (Visual C++)
x = 3 y = 4
x = 3 y = 2
x = 4 y = 2
Bla Bla Bla
1 + 2 = -858993460
Bla Bla Bla
1 + 2 = -858993460
Bla Bla Bla
1 + 2 = 3
*/
