Frage

Grüße, jeder!

meinen eigenen Code Untersuchen, kam ich zu diesem interessanten Line-Up:

const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");

Jetzt bin ich völlig ratlos und kann nicht verstehen, warum es legal ist. Soweit ich verstehe, muss konstante Referenz initialisiert werden, entweder mit r-Wert oder l-Wert. Uninitialized Referenzen nicht existieren kann. Aber ()? Operator führt eine CheckCondition () Funktion, bevor es Wert zu dem Referenz zuordnet. Ich kann jetzt sehen, dass während CheckCondition () ausgeführt wird, refStr existiert, aber noch nicht initialisiert. Was passiert, wenn CheckCondition () eine Ausnahme auslösen, oder Steuerung mit einer goto-Anweisung übergeben? Wird es die Referenz nicht initialisierten verlassen oder bin ich etwas fehlt?

War es hilfreich?

Lösung

Einfachere Beispiel: const int x = foo();

Diese Konstante hat auch initialisiert werden, und für diesen foo() aufgerufen werden muss. Das geschieht in der Reihenfolge erforderlich. X kommt in existance nur, wenn foo kehrt

Ihre weiteren Fragen zu beantworten: Wenn foo() würde throw, wird die Ausnahme von einem catch() irgendwo gefangen werden. Der try{} Block für diesen catch() umgeben const int x = foo(); offensichtlich. Daher const int x ist bereits außerhalb des Bereichs, und es ist unerheblich, dass es nie einen Wert bekam. Und wenn es keine catch für die Ausnahme ist, Ihr Programm (einschließlich const int x) ist verschwunden.

C ++ hat nicht zufällig goto ist. Sie können innerhalb foo() springen, aber das spielt keine Rolle; foo() hat noch zurück.

Andere Tipps

Sie sind etwas fehlt - es ist völlig legal Code, und in der Tat ein solcher Code ist eine der häufigsten und am besten Verwendungen des Bedingungsoperator. Es ist immer ein Fehler zu glauben, dass der Compiler intern Dinge in der gleichen Reihenfolge tun muß, dass der Code auf der Seite gelegt - es vollkommen frei ist der bedingten Operator zu bewerten (die justv ein anderer Ausdruck) und verwenden Sie dann das Ergebnis an führen Sie die Initialisierung.

Wie für eine goto, gibt es keine Möglichkeit, eine in einer Initialisierung zu verwenden. Und wenn eine Ausnahme ausgelöst wird, wird die Referenz als nie in erster Linie geschaffen worden zu sein.

  

Uninitialized Referenzen nicht existieren können.

Leider lustige Dinge können während der Initialisierung durchgeführt werden. Sie könnten auch geschrieben

const int& a = foobar(a) ? 1 : 2;

oder für die Sache

const int& a = a;

Ich nehme an, wie der Compiler Erlös von links nach rechts, eine ist in der Tat in ihrem Umfang auf der rechten Seite, so technisch sollten Sie in der Lage sein, es zu benutzen und im besten Fall kann ich warnen:

"ComeauTest.c", Zeile 9: Warnung: Variable "a" verwendet wird, bevor sein Wert gesetzt

  const int& a = foobar(a) ? 1 : 2;
                        ^

Natürlich kann dies nur in einem unerwarteten Verhalten wie bei jedem nicht initialisierten Variablen.

Ihr Beispiel ist in Ordnung, da Sie die Referenz nicht verwenden, bevor es initialisiert wurde.

  

Ich kann jetzt sehen, dass während CheckCondition () ausgeführt wird, refStr existiert, aber noch nicht initialisiert.

Von einer Sprache Anwalt Sicht ist dies falsch. Während der Initialisierung existiert refStr noch nicht. Ich würde vermuten, dass Ihre visuelle Debugger Sie irreführende Hinweise gibt.

Wenn der Code innerhalb der Initialisierung zu einem Fehlerzustand führt, refStr nicht existieren, und wird nicht immer existiert hat.

Das ist völlig legal. Entweder beendet erfolgreich und der Verweis auf ein gültiges Objekt gebunden ist, oder eine Ausnahme ausgelöst und die Steuerung wird außerhalb des Blocks übertragen und die Referenz ist nicht mehr im Rahmen so niemand davon kümmert sich nicht mehr.

Eine Ausnahme wird Sie an einen Ort bringen, wo refStr nicht zugänglich ist, und man kann nicht an einen Ort gehen, wo es von dort. Eine goto in der Lage, nicht aus CheckCondition (), wenn es eine Funktion ist, und Sie verwenden können, um eine goto nicht, ob es ein Makro. Ein longjmp () die gleiche Wirkung wie eine Ausnahme hat. Sie an einen Ort gehen werden, wo refStr nicht zugänglich

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top