2017-04-13 4 views
2

Ich habe eine Funktion gesehen, die einen Verweis auf einen std :: vector enthält, und das Argument, das daran übergeben wurde, hat mich verwirrt, was passiert. Es sah so aus:Was passiert in diesem Std :: Vector Konstruktor?

void aFunction(const std::vector<int>& arg) { } 


int main() 
{ 
    aFunction({ 5, 6, 4 }); // Curly brace initialisation? Converting constructor? 

    std::vector<int> arr({ 5, 6, 4 }); // Also here, I can't understand which of the constructors it's calling 

    return 0; 
} 

Danke.

Antwort

1

Dies wird std::initializer_list genannt. Es ist seit C++ 11 da.

Hier ist die reference manual wie es funktioniert.

5

Für Objekt durch eine solche Struktur geschaffen werden Sie Konstruktor zur Verfügung stellen müssen, die std::initializer_list und std::vectorone (8) hat akzeptiert:

// c++11 initializer list syntax: 
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

:

Sie ein Beispiel auch auf dieser Seite sehen
vector(std::initializer_list<T> init, 
     const Allocator& alloc = Allocator()); 

Hinweis: C++ 11 ermöglicht auch die Initialisierung von Objekten durch geschweifte Klammern:

Someobject { 
    Someobject(int){} 
}; 

Someobject obj1(1); // usual way 
Someobject obj2{1}; // same thing since C++11 

aber Sie müssen jedoch vorsichtig sein, wenn das Objekt Ctor erwähnt wird, bevor es stattdessen verwendet werden würde:

std::vector<int> v1(2); // creates vector with 2 ints value 0 
std::vector<int> v2{ 2 }; // creates vector with 1 int value 2 

Hinweis 2: für Ihre Frage, wie die Liste erstellt es in der Dokumentation beschrieben:

Ein std :: initialiser_list -Objekt wird automatisch erstellt, wenn:

eine braced-init-Liste in der Listeninitialisierung verwendet wird, einschließlich der Initialisierungs- und Zuweisungsausdrücke der Funktionsauflistungsliste

eine verspannt-init-Liste wird automatisch gebunden, auch in einer for-Schleife reichte

+0

Wie wird die initialiser Liste aus der geschweiften Klammern Liste erstellt? Ist es ein konvertierender Konstruktor seitens der Initialisiererliste? – Zebrafish

+0

Danke. Ich werde nie aufhören, diese Sprache zu lernen. – Zebrafish