Чому не std::initializer_list
вбудована основна мова?
Мені здається, що це досить важлива особливість C ++ 11, і все ж він не має власного зарезервованого ключового слова (або чогось іншого).
Натомість initializer_list
це просто клас шаблону зі стандартної бібліотеки, який має спеціальне, неявне зіставлення з нового синтаксису дужок-init-list, {...}
що обробляється компілятором.
На перший погляд, це рішення є досить хакі .
Чи так тепер будуть реалізовані нові доповнення до мови С ++: неявними ролями деяких класів шаблонів, а не основною мовою?
Будь ласка, розгляньте ці приклади:
widget<int> w = {1,2,3}; //this is how we want to use a class
чому був обраний новий клас:
widget( std::initializer_list<T> init )
замість того, щоб використовувати щось подібне до будь-якої з цих ідей:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- класичний масив, ви можете, напевно, додати
const
сюди-туди - три крапки вже існують в мові (var-args, тепер варіативні шаблони), чому б не повторно використовувати синтаксис (і зробити так, щоб він відчував себе вбудованим )
- просто існуючий контейнер, міг додати
const
і&
Усі вони вже є частиною мови. Я написав лише свої 3 перші ідеї, я впевнений, що існує багато інших підходів.
std::array<T>
не є "частиною мови", ніж std::initializer_list<T>
. І це далеко не єдині бібліотечні компоненти, на які покладається мова. Див. new
/ delete
, type_info
Різні типи винятків size_t
тощо
const T(*)[N]
, оскільки це поводиться дуже подібно до того, як це std::initializer_list
працює.
std::array
масив із статичним розміром є менш бажаними альтернативами.