Articles of c ++ 11

Wie wird die std :: -function implementiert?

Gemäß den Quellen, die ich gefunden habe, wird ein Lambda-Ausdruck im Wesentlichen durch den Compiler implementiert, der eine class mit überladenem functionsaufrufoperator und den referenzierten Variablen als Mitglieder erzeugt. Dies legt nahe, dass die Größe der Lambda-Ausdrücke variiert, und bei genügend Referenzvariablen kann diese Größe beliebig groß sein . Eine std::function sollte eine feste Größe […]

Dekltyp und Klammern

Ich verstehe die letzte Zeile des Beispiels auf Seite 148 des FCD (§7.6.1.2 / 4) nicht: const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1 = i; // type is const int&& decltype(i) x2; // type is int decltype(a->x) x3; // type is double decltype((a->x)) […]

Wann sollte der Initiator mit geschweiften Klammern verwendet werden?

In C ++ 11 haben wir diese neue Syntax zum Initialisieren von classn, die uns eine große Anzahl von Möglichkeiten gibt, Variablen zu initialisieren. { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex b(3,4); std::complex a{3,4}; std::complex c = {3,4}; auto d […]

Was bedeutet “… …” Token? dh doppelter Ellipsenoperator im Parameterpaket

Beim Durchsuchen der aktuellen Implementierung von C ++ 11-Headern durch gcc bin ich auf das “……” -Token gestoßen. Sie können überprüfen, dass der folgende Code gut kompiliert [über ideone.com]. template struct X { /* … */ }; template struct X // this line is the important one { /* … */ }; Also, was bedeutet […]

Warum funktioniert std :: shared_ptr ?

Ich habe Code gefunden, der std :: shared_ptr verwendet, um eine beliebige Bereinigung beim Herunterfahren durchzuführen. Zuerst dachte ich, dass dieser Code nicht funktionieren könnte, aber dann habe ich Folgendes versucht: #include #include #include class test { public: test() { std::cout << "Test created" << std::endl; } ~test() { std::cout << "Test destroyed" << std::endl; […]

Warum in C ++ 11 nicht-Member Begin und End-functionen verwenden?

Jeder Standardcontainer verfügt über eine begin und Endmethode zum Zurückgeben von Iteratoren für diesen Container. Allerdings hat C ++ 11 offenbar freie functionen namens std::begin und std::end die die begin und end std::end aufrufen. Also, anstatt zu schreiben auto i = v.begin(); auto e = v.end(); du würdest schreiben using std::begin; using std::end; auto i […]

Kann C ++ – Code sowohl in C ++ 03 als auch in C ++ 11 gültig sein, aber unterschiedliche Dinge?

Ist es möglich, dass C ++ – Code sowohl dem C ++ 03- Standard als auch dem C ++ 11- Standard entspricht, aber je nachdem, unter welchem ​​Standard er kompiliert wird, unterschiedliche Dinge tun?

Verlässt das Bewegen das Objekt in einem nutzbaren Zustand?

Sagen wir, ich habe zwei Vektoren und ich bewege einen zum anderen, v1 = std::move(v2) ; Ist v2 noch in einem brauchbaren Zustand?

Variadische functionsvorlage mit Packexpansion nicht im letzten Parameter

Ich frage mich, warum der folgende Code nicht kompiliert: struct S { template S(T…, int); }; S c{0, 0}; Dieser Code kann sowohl mit clang als auch mit GCC 4.8 kompiliert werden. Hier ist der Fehler mit clang: test.cpp:7:3: error: no matching constructor for initialization of ‘S’ S c{0, 0}; ^~~~~~~ test.cpp:4:5: note: candidate constructor […]

Reihenfolge der Auswertung von Operanden

Im Ausdruck a + b , ist a garantiert vor b evaluiert, oder ist die Reihenfolge der Auswertung nicht spezifiziert? Ich denke, es ist letzteres, aber ich habe Mühe, im Standard eine definitive Antwort zu finden. Da ich nicht weiß, ob C dies anders als C ++ behandelt, oder wenn Evaluierungsreihenfolgenregeln in C ++ 11 […]