2017-10-01 1 views
-3

Ich bemerke, dass std::optional, std::variant, std::any alle Konstrukteure haben beidestd::initializer_list und args... zugleich akzeptieren.Warum gibt es einen Konstruktor akzeptieren

std::optional ctor (7)

std::any ctor (6)

std::variant ctor (8)

Warum gibt es so ein Konstruktor? Welchen Anwendungsfall unterstützt es?

+3

Die von Ihnen verlinkte Seite enthält ein Beispiel. – chris

+0

Ich nehme an, Sie sprechen über das Beispiel von st :: optional? // ruft std :: string auf (initializer_list ) Konstruktor std :: optional o4 (std :: in_place, {'a', 'b', 'c'}); Sicher, es ist in Ordnung. Aber ich frage mich, warum es ein "Args ..." gibt, nach initializer_list. Ich meine, nur Args .. ist in Ordnung, nur initializer_list ist ok, warum beides? – ZhangFengze

+1

"* Warum beide *" ist nicht die gleiche Frage wie "* Wie man es benutzt *", die eine offensichtliche Antwort hat. Ich schlage vor, dass Sie neu formulieren, um zu fragen, was Sie eigentlich wissen möchten. – StoryTeller

Antwort

1

In Ordnung, das ist eine dumme Frage.

Vielen Dank, dass Sie mir helfen, die Frage zu bearbeiten.

Es ist ganz in Ordnung, dass Sie sowohl initializer_list als auch Parameterpack verwenden.

Zum Beispiel hat std :: vector einen Konstruktor, der initializer_list und allocator akzeptiert.

Und ich getestet, das scheint die Antwort.

std::variant<std::vector<int,std::allocator<int>>> v(std::in_place_index<0>,{1,2,3,4},std::allocator<int>()); 

for(int i: std::get<0>(v)) 
{ 
    std::cout<<i<<std::endl; 
} 

Und es gibt eine andere Frage, warum initializer_list speziell von anderen Vorlagenargumenten getrennt werden muss. Ich denke, ich kann es irgendwo anders finden.

Verwandte Themen