4

Es war schwer, von der proposal abzuleiten.
Werden C++ 17 strukturierte Bindungen ihre Bezeichner von links nach rechts initialisieren?Sind die Identifikatoren einer strukturierten Bindung der Reihe nach initialisiert?

Ist dies garantiert "zuerst", "zweite", dann "dritte" zu drucken?

#include <iostream> 

struct A{ A(){std::cout << "first\n"; } }; 
struct B{ B(){std::cout << "second\n"; } }; 
struct C{ C(){std::cout << "third\n"; } }; 

struct D{ 
    A first; 
    B second; 
    C third; 
}; 

auto f(){ 
    return D{}; 
} 

int main(){ 
    auto [a,b,c] = f(); 
} 
+0

Nach dem Lesen des Vorschlags (eine nette und willkommene) würde ich sagen, es ist nicht nur "schwer abzuleiten", sondern * unmöglich *. Während der Vorschlag einige Beispiele zeigt, sagt er nicht explizit etwas über die Reihenfolge der Bewertung oder Sequenzierung aus. –

+1

Ich denke, C++ definiert bereits die Reihenfolge der Objekte Initialisierung in einer Klasse, die durch die Deklarationsreihenfolge ist, ist es? – Mine

+1

@JoachimPileborg Richtig. Ich hoffe, es ist klar aus der Grammatik Ergänzungen: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0217r2.html –

Antwort

1

Es wird garantiert, „erster“ zu drucken, „zweite“, dann „dritte“, aber nicht von den Structured bindings stattdessen durch den Konstruktor struct D.

Der Aufruf von f() wird eine Instanz von struct D und D ‚s Konstruktor wird aufgerufen, und die Objekte in D wird durch die Reihenfolge der Deklaration initialisiert werden, konstruieren, die A bedeutet, B wird C mit dem initialisiert werden Reihenfolge, und "erste", "zweite", "dritte" wird gedruckt.

Aber ich bin mir nicht sicher, wie Structured bindings Initialisierungsreihenfolge definiert ist.

3

Strukturierte Bindung nicht Kopie Werte; es Referenzen sie. In Ihrem Beispiel ist a keine Kopie des ersten Elements des Rückgabewerts. Es ist ein Hinweis darauf. Da Sie Referenzen anstelle von Werten initialisieren, kann die Reihenfolge der Initialisierung nicht erkannt werden, indem die Reihenfolge der Konstruktoraufrufe angezeigt wird.

Für eine Struktur mit öffentlichen Mitgliedern ist die Reihenfolge des Abrufs dieser Referenzen irrelevant, da Sie diesen Prozess nicht stören können. Für eine benutzerdefinierte Struktur, die die Methoden implementiert, die strukturierte Bindung verwendet, ist das eine andere Geschichte.

Derzeit steht uns jedoch der endgültige Standardwortlaut, der in die C++ 17 CD aufgenommen wurde, nicht zur Verfügung. Es ist also unmöglich zu wissen, in welcher Reihenfolge solche Schnittstellenfunktionen aufgerufen werden oder ob überhaupt eine Reihenfolge angegeben wird.