[C++] Wozu Variablen in ihrer eigenen Initialiserung nutzen?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8265
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[C++] Wozu Variablen in ihrer eigenen Initialiserung nutzen?

Beitrag von Krishty »

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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
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

Beitrag von B.G.Michi »

Ich habe es mal verwendet, um zu verhindern, dass eine Variable von GCC wegoptimiert wurde, da sie nur zur "static" Initialisierung verwendet wurde:

Code: Alles auswählen

static const int dummy = DoInitialization(dummy);
(Standardkonform?)
Benutzeravatar
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

Beitrag von Sternmull »

Ich könnte mir vorstellen das dieses Feature mit abfällt um so was zu erlauben:

Code: Alles auswählen

bool Blub();

struct Foo
{
   int x, y;
   int *z;
};

Foo foo = {1, 2, Blub() ? &foo.x : &foo.y};
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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8265
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Wozu Variablen in ihrer eigenen Initialiserung nut

Beitrag von Krishty »

… 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:

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);
};
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten