Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Чёрт, тип string до сих пор не встроен в ядро языка, а реализован как шаблон в Standard Library.Если автору нужно, чтобы было как в Python, пусть программирует на Python. Не надо превращать C++ в еще один C#.
когда каждая 2я библиотека имеет свою реализацию строк и вообще всего на свете — это печальноКому нужно решение по умолчанию, используют std::string. Лишать остальных права выбора и контроля над своей программой на базовом уровне не вижу оснований. В этом весь дух C++, убрать его, значит убить язык. Наверное, некоторые именно этого и добиваются.
простоту и доступность языка для новых разработчиковМне неочевидна истинность утверждения, что для новых разработчиков C++ должен быть во всем простым и доступным.
лямбда в общем случае может иметь тип только std::function
Например, лямбда в общем случае может иметь тип только std::function, что лишает разработчика возможности создать альтернативу
на самом деле лямбда это просто класc с переопределённым оператором ()Подразумевалась альтернатива std::function, как элементу пусть и стандартной, но библиотеки, а не лямбде, которая как раз удобный синтаксический сахар языка.
Подразумевалась альтернатива std::function
auto hello = [] () { std::cout << "Hello, world!" << std::endl; };
auto hello_100 = [hello] () { for (int i = 0; i < 100; ++i) hello(); };
Std::function использует malloc и указатели для полиморфизма в рантайме, а лямбда — это просто анонимная структура с перегруженным (), ваш пример с auto никуда в кучу не лезет.Все это следует из текста примера?
Элементы в памяти расположены в обратном порядке, как параметры в стеке.
+ ещё список проблем:
Я просто привёл простейшее решение, можно всё сделать совершенно по другому, просто хотел показать, что чтобы пройтись по элементам std::initializer_list ненужен, и можно написать свой аналогЧтобы данный (модифицированный) пример корректно работал, нужно скопировать каждый элемент внутрь списка, т.е. это перебор отдельных копий, а не элементов исходного списка, представленных в виде непрерывного массива. Строго говоря, принципа заменяемости initializer_list пример пока не демонстрирует.
Ок вот другой вариант, ещё лучше и проще.Принципиальной разницы не появилось, параметры все так же на стеке в обратном порядке, о доступе к массиву элементов речи нет.
Тут копируются только указатели.Указатели на параметры в стеке, которые недействительны после выхода из конструктора списка?
(я таких могу ещё кучу придумать)Зачем куча, если нужен один, воспроизводящий поведение initializer_list.
Принципиальной разницы не появилось, параметры все так же на стеке в обратном порядке, о доступе к массиву элементов речи нет.
Указатели на параметры в стеке, которые недействительны после выхода из конструктора списка?угу но, зато можно по нему потом пройтись как по массиву без проблем и скопировать данные куда угодно.
Зачем куча, если нужен один, воспроизводящий поведение initializer_list.
с меньшей вероятностью сделают всё ту же старую ошибку, написав что-то вроде «for (i=0; i<=length;i++)», а потом ещё будут спрашивать вас, почему этот код иногда работает, а иногда падает внутри функций, из которых был вызван
Хотите list в Python? Просто наберите «a = [1,2,3]». Готово.
std::vector<int> a = {1,2,3}; //Готово.
C++ — Статическая | Слабая | Явная
при этом в языке со строгой типизацией можно прострелить себе не только ногу, но и голову
detach, который не потокобезопасен:QVector<int> v;
QVector<int>::const_iterator it = v.begin(); // does no thread safe
QVector<int>::const_iterator it2 = v.constBegin(); // DOES thread safe
Вторая — джуниоры(или даже сеньоры, которые, как вы думаете, никогда не должны быть повышены) с меньшей вероятностью сделают всё ту же старую ошибку, написав что-то вроде «for (i=0; i<=length;i++)», а потом ещё будут спрашивать вас, почему этот код иногда работает, а иногда падает внутри функций, из которых был вызван.
i должно быть строго меньше length.О____О
Сравнение C++ Standard и Boost