2013-06-03 19 views
6

Pierwsza część:Jaka jest podstawowa struktura std :: initializer_list?

std::initializer_list jest bardzo pomocna funkcja C++ 11, więc zastanawiałem się, jak to jest realizowane w bibliotece standardowej. Z tego, co przeczytałem here, kompilator tworzy tablicę typu T i podaje wskaźnik do initializer_list<T>.

Podaje również, że skopiowanie initializer_list utworzy nowy obiekt, odwołujący się do tych samych danych: dlaczego tak jest? Chciałbym się domyślić, że albo:

  • kopiuje dane dla nowego initializer_list
  • porusza własności danych do nowej initializer_list

część druga:

z Just jeden z wielu referencji online dla konstruktorów std::vector:

vector (initializer_list<value_type> il, 
    const allocator_type& alloc = allocator_type()); 

(6) lista inicjator konstruktor

konstruktów pojemniku kopię każdego z elementów IL, w tej samej kolejności.

nie jestem wygodne z semantyki move jeszcze, ale nie mógł dane il zostać przeniesione do vector? Nie jestem świadomy głębokiej implementacji std::vector, ale IIRC używa zwykłych tablic.

+2

Wydaje się, że to kolejny powód, by nie ufać cplusplus.com. Wchodząc do standardu, w końcu przybywa do citor inicjalizatora wywołując ctor-iteratorów ctor, który (wykorzystując konstrukcję emues) przeniesie elementy, jeśli to możliwe. – Angew

+6

cplusplus.com to okropna, straszna strona, która szkodzi społeczności C++. Ktoś powinien zniszczyć serwery, które go hostują, spalić dyski twarde, zamknąć je w betonie i zatopić na dnie oceanu. –

+1

'Jaka jest podstawowa struktura std :: initializer_list?' Oddalona od ciebie, nie bez powodu. –

Odpowiedz

12

Jaka jest podstawowa struktura std::initializer_list?

Najprawdopodobniej tylko para wskaźników lub wskaźnik i rozmiar. Punkt 18,9/2 C++ 11 standardowych nawet wspomina o tym w (nienormatywnej) Uwaga:

obiektu typu initializer_list<E> zapewnia dostęp do tablicy obiektów typu const E. [Uwaga: Para wskaźników lub wskaźnik plus długość będą oczywistymi reprezentacjami dla initializer_list. initializer_list służy do implementacji list inicjalizujących określonych w 8.5.4. Kopiowanie obiektu initializer list nie powoduje skopiowania podstawowych elementów. -end uwaga]

Ponadto:

nie jestem wygodne z semantyki move jeszcze, ale nie mógł dane il zostać przeniesione do wektora?

nr, nie można przenieść z elementów o initializer_list, ponieważ elementy dobrze initializer_list mają być niezmienne (patrz pierwsze zdanie w cytowanym wyżej ustępie). Jest to również powód, dla którego tylko kwalifikowane funkcje członkowskie dają dostęp do elementów.

+1

Zauważ, że technicznie konstruktor taki jak 'foo (foo const &&);' jest konstruktorem ruchu, i faktycznie byłby wywoływany jeśli owinąłbyś iteratory 'std :: initializer_list' w' std :: move_iterator's lub użył niektóre takie sztuczki.Taki konstruktor rzadko może zrobić coś pożytecznego (lub innego niż standardowy konstruktor * copy *). –

+0

@LucDanton: 'foo (foo const &&)' ... ew ... :) Ale tak technicznie masz rację. Nadal nie zmienia to faktu, że elementy 'initializer_list' mają być niezmienne, więc" move constructor "nie będzie mógł przenieść niczego bez powodowania niezdefiniowanego zachowania. –

+0

@AndyProwl: Lista inicjalizatorów może również zawierać odwołania do zmiennych. W takim przypadku ruch przesuwa dane przywoływanego elementu. Więc tak, sama lista jest niezmienna (zawsze będzie zawierała to samo odniesienie), ale ctor może być użyteczny. –

Powiązane problemy