Перемещение конструкторов и Сильная Гарантия Исключения - PullRequest
15 голосов
/ 16 мая 2011

Просто быстрый вопрос, на который я не могу найти хорошую ссылку, особенно в отношении текущих реализаций будущего стандарта C ++ 0x.

Поскольку конструкторы перемещения могут выдавать , это означает, что некоторые стандартные библиотечные функции не могут обеспечить строгую гарантию исключений (например, vector<T>::resize()).

Было выдвинуто предложение: 1) сделать все конструкторы перемещения стандартной библиотеки "безбрасыванием" и 2) добавить проверки времени компиляции в коде пользователя, чтобы убедиться, что, например. std::pair<std::string, MyType> определяет конструктор перемещения nothrow или вообще не использует конструктор перемещения.

Что случилось с этим предложением (особенно в отношении этого вопроса )? Как проблема «решается» в окончательном варианте?

Самое главное, что это значит для меня, когда я использую недавний GCC или MSVC 10? Обеспечивают ли эти реализации стандартной библиотеки гарантию сильных исключений, например, на. std::vector<MyTypeWithAThrowingMoveConstructor>::resize()?

РЕДАКТИРОВАТЬ: Я не видел этот вопрос , который явно связан. Если будет достигнут консенсус по поводу того, что мой вопрос является дубликатом, закройте его. Тем не менее, меня действительно интересует, что реализовано , а не , что обсуждалось .

1 Ответ

4 голосов
/ 16 мая 2011

Я не проверял конкретные реализации, но общая идея заключается в том, что если конструктор перемещения может выдавать, вектор должен будет вместо этого скопировать элементы. Таким образом, можно сделать откат в случае исключения.

Существует даже вспомогательная функция move_if_noexcept, определенная в <utility>, чтобы помочь ей решить, что делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...