Dlaczego nie std::initializer_list
ma wbudowanego języka podstawowego?
Wydaje mi się, że jest to dość ważna cecha C ++ 11, a mimo to nie ma własnego zarezerwowanego słowa kluczowego (lub czegoś podobnego).
Zamiast tego initializer_list
jest to po prostu klasa szablonu z biblioteki standardowej, która ma specjalne, niejawne mapowanie z nowej składni listy braced-init, {...}
która jest obsługiwana przez kompilator.
Na pierwszy rzut oka to rozwiązanie jest dość hakerskie .
Czy w ten sposób będą teraz wdrażane nowe dodatki do języka C ++: przez niejawne role niektórych klas szablonów, a nie przez język rdzenia ?
Rozważ te przykłady:
widget<int> w = {1,2,3}; //this is how we want to use a class
dlaczego wybrano nową klasę:
widget( std::initializer_list<T> init )
zamiast używać czegoś podobnego do któregokolwiek z tych pomysłów:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- klasyczną tablicę, którą prawdopodobnie mógłbyś dodać
const
tu i tam - trzy kropki już istnieją w języku (var-args, teraz variadic templates), dlaczego nie użyć ponownie składni (i sprawić, by wyglądała jak wbudowana )
- tylko istniejący kontener, można dodać
const
i&
Wszystkie są już częścią języka. Napisałem tylko swoje 3 pierwsze pomysły, jestem pewien, że istnieje wiele innych podejść.