Подтвердить что ты не робот

Исключить безопасный код и переместить семантику

Я хочу написать класс контейнера. Этот контейнер имеет метод вставки, который имеет две специализации: сначала использует конструкторы копирования для копирования данных из одного контейнера в другой контейнерный элемент. Если экземпляр конструктора создает исключение, я просто отменю все изменения в контейнере, как ничего не происходит.

Вторая специализация использует конструктор перемещения, и это место, где все осложнилось. Когда я перемещаю элементы из одного контейнера в другой элемент контейнера по элементу, перемещение конструктора может вызвать исключение. Если это произойдет - у меня очень грязное состояние, когда некоторые элементы перемещены, а другие элементы остаются в нем в оригинальных местах. Если я попытаюсь переместить элементы обратно - я могу получить другое исключение.

Можно ли написать что-то подобное безопасным образом или безопасностью исключений, а семантика перемещения взаимно исключена?

4b9b3361

Ответ 1

Используйте std:: move_if_noexcept при написании кода с исключительной чувствительностью, но все же хотите использовать семантику перемещения, когда это безопасно для компиляции.

Подробнее см. разговор Скотта Мейерса в GoingNative 2013.

PS: О да, пожалуйста, помните, что если ваши вещи не являются копируемыми, вы будете перемещать их независимо от throw/nothrow вашего конструктора перемещения.

Ответ 2

Использование делегата конструктора - один из способов сделать это. Если конструктор без делегирования (возможно, один без аргументов, устанавливающий ваши члены в значения по умолчанию) завершен, а делектор делегирования конструктора, стандарт говорит, что ваше локальное состояние удалено. Таким образом, вы не можете течь. Я узнал об этом только сегодня в в этом разговоре.

Кстати: какой тип контейнера вы реализуете, что STL еще не настроил для вас?