Например, vector::push_back: If an exception is thrown (which can be due to Allocator::allocate() or element copy/move constructor/assignment), this function has no effect (strong exception guarantee).
Я так понимаю, они ради неё жертвуют производительностью и вместо перемещения используют копирование в случае не noexcept move конструктора. Может так и сделаю.
Я так понимаю, они ради неё жертвуют производительностью и вместо перемещения используют копирование в случае не noexcept move конструктора. Может так и сделаю.
Я выше написал - проблему бросающего исключения конструктора копирования/аллокатора/operator= это не решает
Я не первый раз встречаю самописные STL или контейнеры и почему-то авторы очень много внимания уделяют оптимизациям и реализации, совершенно забывая про гарантии интерфейса
Сначала всё делалось для себя под свои проекты, где у меня исключения вообще не используются. Но потом я всё-таки задумался о том, что надо сделал как надо, чтобы мою либу юзали и даже у себя таску отметил об exception safety. Но пока ещё не успел её сделать. Если в move конструкторе вылетит исключение, скорее всего будет UB и креш, даже базовой гарантии сейчас нет.
Сначала всё делалось для себя под свои проекты, где у меня исключения вообще не используются. Но потом я всё-таки задумался о том, что надо сделал как надо, чтобы мою либу юзали и даже у себя таску отметил об exception safety. Но пока ещё не успел её сделать. Если в move конструкторе вылетит исключение, скорее всего будет UB и креш, даже базовой гарантии сейчас нет.
О том и речь - более специфические контейнеры могут быть быстрее менее специфических, но дают меньше гарантий. Если уж позиционировать библиотеку как замену STL, то и гарантии стоит сохранить
Я выше написал - проблему бросающего исключения конструктора копирования/аллокатора/operator= это не решает
Почему не решает? Если мы копируем, а не переносим, мы можем просто удалить новую аллокацию, оставив старую нетронутой. Это и будет strong exception safety guarantee. А если мы перемещали и вылетел эксепшен, не факт, что мы сможем успешно переместить всё назад, чтобы откатить.
Сначала всё делалось для себя под свои проекты, где у меня исключения вообще не используются. Но потом я всё-таки задумался о том, что надо сделал как надо, чтобы мою либу юзали и даже у себя таску отметил об exception safety. Но пока ещё не успел её сделать. Если в move конструкторе вылетит исключение, скорее всего будет UB и креш, даже базовой гарантии сейчас нет.
Был пункт 2 про расширение итераторов и ренджей. Какими средствами предполагается это сделать?
Почему не решает? Если мы копируем, а не переносим, мы можем просто удалить новую аллокацию, оставив старую нетронутой. Это и будет strong exception safety guarantee. А если мы перемещали и вылетел эксепшен, не факт, что мы сможем успешно переместить всё назад, чтобы откатить.
Почему не решает? Если мы копируем, а не переносим, мы можем просто удалить новую аллокацию, оставив старую нетронутой. Это и будет strong exception safety guarantee. А если мы перемещали и вылетел эксепшен, не факт, что мы сможем успешно переместить всё назад, чтобы откатить.
Есть Traversable обобщающийся не только на последовательные данные, но и на иерархичные
О том и речь - более специфические контейнеры могут быть быстрее менее специфических, но дают меньше гарантий. Если уж позиционировать библиотеку как замену STL, то и гарантии стоит сохранить
Это лечится проверками на noexcept конструктор. Для тех типов, которые я использую, с noexcept-конструкторами , медленнее не станет.
Почему не решает? Если мы копируем, а не переносим, мы можем просто удалить новую аллокацию, оставив старую нетронутой. Это и будет strong exception safety guarantee. А если мы перемещали и вылетел эксепшен, не факт, что мы сможем успешно переместить всё назад, чтобы откатить.
И тогда уж сразу стоит изучить ситуацию, аналогичную этой:
Почему не решает? Если мы копируем, а не переносим, мы можем просто удалить новую аллокацию, оставив старую нетронутой. Это и будет strong exception safety guarantee. А если мы перемещали и вылетел эксепшен, не факт, что мы сможем успешно переместить всё назад, чтобы откатить.
Еще чтоб получить идеальную композируемость, вместе с Traversable нужны линзы, призмы, изоморфизмы, фолды и траверсы
Был пункт 2 про расширение итераторов и ренджей. Какими средствами предполагается это сделать?
Различные генераторы, декораторы типа Filter, Map, а также алгоритмы типа Reduce. Оно есть и в C++20 ranges, но у меня гораздо больше разных. И написать самому проще простого, простейший класс с тремя методами First(), Empty(), PopFirst - не надо даже шаблонов, наследования и адаптеров, как ranges от Эрика.