Seite 1 von 1

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

Verfasst: 14.05.2013, 23:40
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

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

Verfasst: 15.05.2013, 04:20
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?)

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

Verfasst: 15.05.2013, 10:01
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.

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

Verfasst: 20.05.2013, 21:09
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);
};