[ grabber @ 19.10.2011. 00:07 ] @
Zanima me zasto nije dozvoljen overloading funkcija prema povratnom tipu. Npr ako imam funkciju

int f(int a){....}

i double f(int a){....}

a u main-u, kod poziva funkcije npr

double varijabla = f(5);

zasto je kompajleru konfuzno kod poziva ove funkcije, kada sam jasno rekao da ocekujem nazad double vrijednost, a da bi dobio double, logicno je da trebam pozvati onu funkciju imena F koja vraca tip double? je li ima tu neko objasnjenje zasto ne ide tako? razumijem da se ovo moze rijesiti sa template funkcijama i slicno, ali me ne zanima rjesenje problema, nego zasto ovo nije moguce.

hvala unaprijed
[ Mihajlo Cvetanović @ 19.10.2011. 10:15 ] @
U ovom slučaju ono što je logično za jednu osobu ne mora da bude logično za drugu. Šta ako ja baš želim da pozovem funkciju koja vraća int i da rezultat dodelim double promenljivoj? Teoretski bih morao da koristim neki privremeni int, ali šta ako hoću da pozovem funkciju u zaglavlju for petlje, ili u inicijalizacionoj listi nekog konstruktora? Tada bi bilo nemoguće pozvati funkciju koja vraća int tamo gde se očekuje double. Pošto novi hipotetički feature C++ jezika ne može da se koristi svuda gde očekujemo da može da se koristi onda takav feature i ne može biti uveden. I zato povratna vrednost funkcije ne ulazi u potpis funkcije.

Neka te teši činjenica da u jeziku C ranije (a mislim ni sada u standardnom C) nisi mogao da imaš nikakve dve istoimene funkcije.
[ Goran Arandjelovic @ 21.10.2011. 14:51 ] @
Ovde se priča samo o prostim tipovima, ali pazi i ovo:

Code:

class A
{
  void F() const
  {
    cout << "A::F" << endl;
  }
};

class B
{
  void F() const
  {
    cout << "B::F" << endl;
  }
};

A MojaFunkcija(); // vraca instancu A
B MojaFunkcija(); // vraca instancu B


Code:

MojaFunkcija().F(); // Ovo je sasvim validno u C++-u, ali koja funkcija "MojaFunkcija" treba biti pozvana?


Dakle, šta ako ne postoji leva strana (lvalue) kojoj nešto dodeljuješ? Zbog toga, i zbog onoga što je rekao Mihajlo ne postoji overload po povratnoj vrednosti.