2017-07-21 1 views
2

So kann ich dies tun:Kann ich ein Array von einer initializer_list instanziieren?

#include <iostream> 
#include <vector> 
main(){ 
    auto init = {1,2,3}; 
    std::vector<int> v(init); 
} 

und ich kann dies tun:

#include <iostream> 
#include <vector> 
main(){ 
    int i[3] = {1,2,3}; 
} 

Warum kann ich das nicht tun:

#include <iostream> 
#include <vector> 
main(){ 
    auto init = {1,2,3}; 
    int i[3] = init; 
} 

?

der Compiler sagt mir dies:

main.cpp: In function 'int main()': 
main.cpp:10:16: error: array must be initialized with a brace-enclosed 
initializer 
    int i[3] = init; 
       ^~~~ 

exit status 1 

es keinen Unterschied machen, wenn ich init mit std::initializer_list<int> statt auto erstellen.

Sie können damit herumspielen here.

Antwort

3

Wenn Sie auto init = {1,2,3}; tun, erhalten Sie eine std::initialized_list. Dies ist nicht dasselbe wie nur {1,2,3}, das ist eine braced-init-Liste. Sie können ein Array mit einer braced-init-Liste initialisieren, da es ein Aggregat ist, aber Sie können std::initialized_list nicht verwenden, da dies einen Konstruktor erfordert.

+0

aah, so '{1,2,3}' ist eigentlich keine 'std :: initializer_list', sondern eine * braced-init-list *, und es gibt einen Konstruktor, der mir eine' std :: initializer_list gibt 'davon. Kann ich eine Instanz einer * braced-init-list * erstellen? – will

+0

@will Nein, Sie können kein Objekt haben, das eine * braced-init-Liste ist * Sie können nur verwendet werden, um Dinge zu initialisieren. – NathanOliver

+0

@will hier ist eine gute verwandte lesen: https://stackoverflow.com/questions/37682392/what-is-acurly-brace-enclosed-list-if-not-an-intializer-list – NathanOliver

Verwandte Themen