Lebensdauer Default-Argumente
-
Bashar schrieb:
Stringliterale haben statische Speicherdauer.
Danke für die Antwort, jetzt ist mir alles klar

-
Und wie siehts mit "normalen Default-Objekten" aus ? (also ohne static Membern)
Gruß,
Simon2.
-
Hier ist weit und breit kein temporäres Objekt in Sicht.
-
camper schrieb:
Hier ist weit und breit kein temporäres Objekt in Sicht.
DAS hatte Bashar auch schon entdeckt.

OK, also meine Frage mal mit Code:
1.)void f(std::string& s = std::string("Simon2"));Haben wir hier ein temporäres Objekt ? Wenn ja: Wie lange lebt es ?
2.)
Wie sieht die Situation beivoid f(std::string const& s = std::string("Simon2"));aus ?
3.)
Wird beivoid f(std::string s = std::string("Simon2"));noch eines erzeugt und s per CpyCtor konstruiert ? Darf der Compiler die Konstruktion ggf. "abkürzen" ?
Gruß,
Simon2.
-
Zu 1.) und 2.) gab es die Tage schonmal folgendes in http://c-plusplus.net/forum/viewtopic-var-t-is-210594.html
camper schrieb:
Ein temporäres Objekt, dass an einen Refernzparameter eines Funktionsaufrufes gebunden wird, lebt bis zum Ende des vollständigen Ausdrucks, der den Funktionsaufruf enthält .
-
- ist nicht möglich.
3.)
Wird beivoid f(std::string s = std::string("Simon2"));noch eines erzeugt und s per CpyCtor konstruiert ? Darf der Compiler die Konstruktion ggf. "abkürzen" ?
ja und ja. Es gibt hinsichtlich der Auswertung keinen Unterschied zwischen einem Defaultargument und einem Funktionsaufruf, der das Argument explizit übergibt. Unterschiede bestehen lediglich im Namelookup - das spielt aber für diese Frage keine Rolle.
-
LordJaxom schrieb:
Zu 1.) und 2.) gab es die Tage schonmal folgendes in http://c-plusplus.net/forum/viewtopic-var-t-is-210594.html
camper schrieb:
Ein temporäres Objekt, dass an einen Refernzparameter eines Funktionsaufrufes gebunden wird, lebt bis zum Ende des vollständigen Ausdrucks, der den Funktionsaufruf enthält .
Das zusammen mit
camper schrieb:
...Es gibt hinsichtlich der Auswertung keinen Unterschied zwischen einem Defaultargument und einem Funktionsaufruf, der das Argument explizit übergibt....
hilft mir schon deutlich weiter.
Noch eine Nachfrage:
Istvoid f(std::string& s); f(std::string("Simon2"));dann auch verboten oder hört die Analogie da auf ?
Und nochmal zur Sicherheit:
void f(std::string const & s = std::string("Simon2"));ist also erlaubt, ja ?
Gruß,
Simon2.
-
Simon2 schrieb:
Noch eine Nachfrage:
Istvoid f(std::string& s); f(std::string("Simon2"));dann auch verboten oder hört die Analogie da auf ?
Ja, ist verboten, da ein temporäres Objekt nicht an eine non-const Referenz gebunden werden kann.
Simon2 schrieb:
Und nochmal zur Sicherheit:
void f(std::string const & s = std::string("Simon2"));ist also erlaubt, ja ?
Ich denke mal ja

-
interessant wird es ja auch erst bei
void foo (string&); foo (string() = "foo");
-
queer_boy schrieb:
interessant wird es ja auch erst bei
void foo (string&); foo (string() = "foo");
Interessant ist auch
std::complex<double> a = 1, b = 2, c = 3; const std::complex<double>& d = a + b + c; const std::complex<double>& e = ( a + b ) += c; std::cout << d; // ok std::cout << e; // boom