Некоторые магазины (например, некоторые команды разработки видеоигр) отключают поддержку исключений в своей среде сборки. При отключенных исключениях разработчикам нечего было бы объявлять о своих операциях перемещения noexcept
(предполагая, что такой код даже будет скомпилирован). Но стандартные реализации библиотек должны вызывать std::move_if_noexcept
при выполнении некоторых операций (например, std::vector::push_back
). Обычно ли стандартные реализации библиотек проверяют во время компиляции, чтобы убедиться, что исключения отключены, и если да, используйте std::move
вместо std::move_if_noexcept
? Составляют ли компиляторы std::is_nothrow_move_constructible
для возврата true для всех типов, если исключения отключены? Или отключение поддержки исключений имеет неожиданный побочный эффект: std:move_if_noexcept
не может активировать операции перемещения?Отключение поддержки исключений также отключает поддержку `std :: move_if_noexcept`?
Меня интересует, что происходит на практике. Я понимаю, что отключение поддержки исключений выводит нас из области стандарта C++.
Не может быть легко проверить себя? –
@KerrekSB: Я мог бы проверить его сам для компиляторов, к которым у меня есть доступ, но количество компиляторов, к которым у меня есть доступ, ограничено, и я думал, что люди, работающие в средах, где исключения обычно отключены, уже будут знать ответ. Что касается того, было бы «легко» протестировать ... было бы исправление стандартных реализаций библиотек, необходимых для выяснения того, что происходит, и это не всегда простая работа. – KnowItAllWannabe
Ни libC++, ни libstdC++, похоже, не заинтересованы в том, отключает ли компилятор исключения из-за исключения, поэтому у вас не будет волшебных ходов, которые не будут обрабатывать ходы в этих библиотеках. Такие черты, как 'std :: is_nothrow_constructible', выражаются в терминах оператора noexcept', который, как правило, не связан с тем, действительно ли исключения поддерживаются средой. Это лишь абстрактная часть объявления функции в отношении этой особенности. –