Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Это все верно для ссылочной семантики. А для семантики значений не применимо. Например, я бы не хотел возиться со смарт-указателями на std::string. Я хочу просто работать со значениями std::string. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2015, 19:51 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
При этом естественно смарт-указатели полезны при реализации внутренностей таких классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2015, 19:52 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyя бы не хотел возиться со смарт-указателями на std::string. Я хочу просто работать со значениями std::string. Так std::string и есть смарт-указатель на char[], обвешанный другими методами для удобства работы с ним. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2015, 20:23 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Нет. У строки нет семантики указателей. Ее например нельзя разыменовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2015, 20:44 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Вкачу-ка я свои пять копеек. Эта идиома нужна, чтобы обеспечить т.н. "strong exception safety guarantee". Это гарантия того, что операция не портит исходные объекты. Никогда. Они всегда всегда находятся в консистентном состоянии. В случае успеха вы получаете "новое хорошее" состояние. В случае неуспеха - "старое хорошее" (но обработку исключений ни кто не отменял). И исключает случай, когда старое "уже подпортили", а "новое недособрали". Зачем это? Почему не "ручками"? Ок, вот представьте, произошло исключение, вы пытаетесь вернуть объект в "хорошее" состояние, определяете "подпорченные части" и пытаетесь восстановить их, и ваша попытка "вдруг" генетит исключение. Тогда логика восстановления будет, мягко говоря, нетривиальной. Что интересно, ранее контейнер ака vector такую гарантию ("strong exception safety guarantee") и предоставлял. Теперь (в новом стандарте) - нет, из-за появления movable семантики. По примеру Код: plaintext 1. 2. 3. 4. 5. 6. 7. swap может выбросить исключение, так что в этом примере может получиться "частично обменявшийся" вариант ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 19:48 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaЧто интересно, ранее контейнер ака vector такую гарантию ("strong exception safety guarantee") и предоставлял. Теперь (в новом стандарте) - нет, из-за появления movable семантики. Как раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений. А в старом этого нет, но там по факту все реализации не выбрасывали исключения. И гарантии эти получили возможность предоставить как раз из-за появления movable. Т.е. все строго наоборот по отношению к тому что вы сказали )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 21:15 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
По смыслу это близко к попытке ввести "транзактивность" в работу с объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 21:34 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКак раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений. Это очень легко проверить. Смотрим спецификацию (для >С++11) http://en.cppreference.com/w/cpp/algorithm/swap Код: plaintext 1. 2. 3. 4. 5. И видим, что swap не выбрасывает исключений тогда и __только__ __тогда__, когда не выбрасывают исключения movable-конструктор ("перемещающий" конструктор) и movable оператор присваивания ("перемещающий" оператор присваивания). Т.о., swap _НЕ_даёт гарантию отсутствия исключений. Anatoly MoskovskyИ гарантии эти получили возможность предоставить как раз из-за появления movable. Это утверждение я даже комментировать не буду. Movable-семантика позволила исключить дорогостоющую операцию копирования (дорогостоющую - как за счёт процессорного времени на её выполнение, так и дополнительной памяти под "лишнюю" переменную) во временный объект. Это сделало swap более быстрым на не-POD типах и менее требовательным к памяти. Но другой ценой: если раньше в процессе копирования во временную переменную происходило исключение, оно не "портило" оригинальные данные. Сейчас же появление исключения при перемещении (а не копировании, как было раньше) во временный объект __портит__ исходный объект, т.к. суть перемещения - "кража" содержимиого у одного объекта в пользу другого. Обращение "по старому имени" после выполнение move - в общем случае UB. Anatoly MoskovskyТ.е. все строго наоборот по отношению к тому что вы сказали )) Анатолий, вы поторопились. Всё наоборот как раз у Вас :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 15:15 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Специально для вас выделяю то что вам не понятно Anatoly Moskovskyswap над std объектами гарантировано не выбрасывает исключений. Потому что std классы move_constructible и move_assignable. Таким образом, объект либо стандартный и для него swap не кидает исключения, либо объект нестандартный и вы для него либо делаете move-конструктор и move-присвоение и используете std::swap, либо пишете свой swap который не кидает исключения. При этом, для любых классов которые вообще позволяют присвоение можно написать swap, небросающий исключения, так же как и move-конструктор и move-присвоение . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 21:21 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСпециально для вас выделяю то что вам не понятно Anatoly Moskovskyswap над std объектами гарантировано не выбрасывает исключений. Потому что std классы move_constructible и move_assignable. Анатолий, не болтайте ерундой. Простейший пример (берём любую специализацию swap): http://en.cppreference.com/w/cpp/utility/tuple/swap2 Код: plaintext 1. 2. И так практически в каждой специализации. НУ НЕТ ТАМ гарантии - сплошные зависимости. Потому это зависит от реализации. Сделать STL "без выбрасывания исключений" под все платформы практически невозможно. Но некоторым можно попробовать утверждать, что std::tuple не из STL ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 23:20 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaНУ НЕТ ТАМ гарантии - сплошные зависимости Ну не смогли вы раскрутить зависимости и увидеть в них гарантии. Ничего страшного, зайдите с другой стороны. Попробуйте, например привести пример std класса, который можно присваивать, и одновременно в стандарте не указано что для него выполняются все требования noexcept в std::swap ( move-constructible и move-assignable). Все эти зависимости и условия, на которые вы ссылаетесь, они там потому что STL это библиотека шаблонов и она естественно не может давать гарантий по отношению к любым переданным аргументам шаблонов. Но если все аргументы шаблонов - классы std то такие гарантии прямо следуют из стандарта. BagaBagaСделать STL "без выбрасывания исключений" под все платформы практически невозможно Я не говорил что в STL не выбрасываются исключения. Если вам хочется на эту тему поспорить, то оставляю вас наедине с самим собой, как с автором сего утверждения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 01:25 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
Анатолий, вы Ваньку валяете? - "Как раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений." Именно в стандарте _ДО_ С++11 swap имел спецификафию throw(), т.е. пустую. К сожалению, это не соответствовало грубой действительности - там всё равно порождались исключения... Изменения в новом стандарте просто отразили этот факт. Что гарантирует спецификация nothrow? Строго говоря - почти ничего. С её помощью _программист_ зуб даёт сообщает компилятору, что код не генерирует исключение. Благодаря этому компилятор может сделать некоторые оптимизации (прежде всего, на стеке). Если код заявлен как noexcept, но всё равно генерит исключение... Ок - это Ваша нога. Далее. Исключение в swap могут бросать вызываемые там функции (о да, я КЭП). И новая спецификация это явным образом указывает. Мы уже посмотрели: 1. стандартный swap не объявлен как noexcept() - отражает зависимости от "нутра" 2. специализированный swap не объявлен как noexcept() - отражает зависимости 3. конструктор перемещения не объявлен как noexcept(). Можете заглянуть в пецификацию сами - мне лень сюда копипастить. 4. перемещающий оператор присваивания не объявлен как noexcept(). Можете заглянуть в пецификацию сами. Разумеется, на каждый довод у Вас есть шанс попросить "копнуть глубже". Чтобы тянуть время и увиливать. Но всё куда проще. Во-первых, можно сразу спуститься к "силикону". Что вы будете делать с аппаратным исключением? Куда "копать глубже"? Во-вторых, вы сами признали, что сделать STL без исключений (в т.ч. для перемещающих конструкторов и операторов копирования) невозможно. Как же тогда вы собрались обеспечить noexcept swap, ведь его "безысключительность" полностью базируется на невыбрасывании исключений "нутром"? В третьих, если стандарт что-то гарантирует, он это прописывает явным образом. Хотелось бы увидеть пункт стандарта (или его номер), который предоставляет эту гарантию , цитирую: " если все аргументы шаблонов - классы std то такие гарантии прямо следуют из стандарта." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 09:04 |
|
||
|
Идиома copy-on-swap С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaвы сами признали, что сделать STL без исключений (в т.ч. для перемещающих конструкторов и операторов копирования) невозможно Оставляю вас. Вам видимо интересно спорить с придуманными вами утверждениями. Мне - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2015, 11:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38879901&tid=2019108]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 436ms |

| 0 / 0 |
