Hi,
int x = x;
initialisiert die Variable mit sich selber, lässt sie also uninitialisiert. Ziemlich sinnlos und ständige Fehlerquelle.
Der einzige halbwegs sinnvolle Anwendungsfall, den ich für sowas gefunden habe, ist:
struct Foo {
int width;
int height;
int area;
};
Foo foo = {
123,
456,
foo.width * foo.height
};
Aber jetzt erklärt mir Clang, dass das nicht wie erwartet funktionieren wird (VC schluckt es natürlich).
Wozu ist dieses Feature denn jetzt überhaupt noch da (außer, um mich in die Verzweiflung zu treiben)?
Gruß, Ky
[C++] Wozu Variablen in ihrer eigenen Initialiserung nutzen?
- B.G.Michi
- Establishment
- Beiträge: 163
- Registriert: 07.03.2006, 20:38
- Alter Benutzername: B.G.Michi
- Kontaktdaten:
Re: [C++] Wozu Variablen in ihrer eigenen Initialiserung nut
Ich habe es mal verwendet, um zu verhindern, dass eine Variable von GCC wegoptimiert wurde, da sie nur zur "static" Initialisierung verwendet wurde:
(Standardkonform?)
Code: Alles auswählen
static const int dummy = DoInitialization(dummy);
- Sternmull
- Establishment
- Beiträge: 264
- Registriert: 27.04.2007, 00:30
- Echter Name: Til
- Wohnort: Dresden
Re: [C++] Wozu Variablen in ihrer eigenen Initialiserung nut
Ich könnte mir vorstellen das dieses Feature mit abfällt um so was zu erlauben:
Also wenn man die Adresse von noch nicht initialisierten Variablen verwenden will. Das man dabei dann auch leicht auf die noch nicht initialisierten Werte zugreifen kann wurde dabei wohl einfach irgendwie in kauf genommen... irgendwo steht bestimmt das man das eben nicht machen darf.
Code: Alles auswählen
bool Blub();
struct Foo
{
int x, y;
int *z;
};
Foo foo = {1, 2, Blub() ? &foo.x : &foo.y};
- Krishty
- Establishment
- Beiträge: 8351
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [C++] Wozu Variablen in ihrer eigenen Initialiserung nut
… wobei in deinem Beispiel aber auch ein Konstruktor eingeführt werden könnte, der genau das tut. (Nicht, dass ich dafür wäre – ich liebe POD.)
Noch ein Anwendungsfall sind wohl rekursive Lambdas:
Noch ein Anwendungsfall sind wohl rekursive Lambdas:
Code: Alles auswählen
function<int(int)> fib1 = [&fib1](int n) -> int
{
if(n <= 2)
return 1;
else
return fib1(n-1) + fib1(n-2);
};