Чому не 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масив із статичним розміром є менш бажаними альтернативами.