2016-06-10 25 views
0

Sagt der C++ - Standard, dass std::initializer_list<T> eine Referenz auf ein lokales anonymes Array ist? Wenn es heißt, dann sollten wir niemals ein solches Objekt zurückgeben. Jeder Abschnitt im Standard sagt das?C++ 11: speichert std :: initializer_list anonymes Array? Ist es veränderbar?

Eine andere Frage, sind die zugrunde liegenden Objekte einer std::initializer_list<T> veränderbar? Ich habe versucht, es zu ändern:

#include <initializer_list> 
int main() 
{ 
    auto a1={1,2,3}; 
    auto a2=a1;//copy or reference? 
    for(auto& e:a1) 
     ++e;//error 
    for(auto& e:a2) 
     cout<<e; 
    return 0; 
} 

Aber mit Fehler kompiliert: Fehler: Zuwachs von Nur-Lese-Referenz ‚e‘

Wie kann ich es beheben, wenn ich den Wert innerhalb des initializer_list ändern möchten?

+0

'initializer_list' ist unveränderlich. –

Antwort

5

Von [dcl.init.list]:

An object of type std::initializer_list<E> is constructed from an initializer list as if the implementation allocated a temporary array of N elements of type const E , where N is the number of elements in the initializer list. Each element of that array is copy-initialized with the corresponding element of the initializer list, and the std::initializer_list<E> object is constructed to refer to that array.

, dass beide Fragen beantworten sollte: die initializer_list Kopieren kopiert nicht die zugrunde liegenden Elemente, und die zugrunde liegenden Elemente sind const, so dass Sie sie nicht ändern können.

How can I fix it if I wish to change the value inside the initializer_list ?

Verwenden Sie keine initializer_list<int>. Verwenden Sie einen array<int, 3> oder vector<int> oder einen anderen Behälter.

0

Vom cppreference Artikel

Copying a std::initializer_list does not copy the underlying objects.