2014-12-08 2 views
3

Некоторые магазины (например, некоторые команды разработки видеоигр) отключают поддержку исключений в своей среде сборки. При отключенных исключениях разработчикам нечего было бы объявлять о своих операциях перемещения 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++.

+0

Не может быть легко проверить себя? –

+0

@KerrekSB: Я мог бы проверить его сам для компиляторов, к которым у меня есть доступ, но количество компиляторов, к которым у меня есть доступ, ограничено, и я думал, что люди, работающие в средах, где исключения обычно отключены, уже будут знать ответ. Что касается того, было бы «легко» протестировать ... было бы исправление стандартных реализаций библиотек, необходимых для выяснения того, что происходит, и это не всегда простая работа. – KnowItAllWannabe

+1

Ни libC++, ни libstdC++, похоже, не заинтересованы в том, отключает ли компилятор исключения из-за исключения, поэтому у вас не будет волшебных ходов, которые не будут обрабатывать ходы в этих библиотеках. Такие черты, как 'std :: is_nothrow_constructible', выражаются в терминах оператора noexcept', который, как правило, не связан с тем, действительно ли исключения поддерживаются средой. Это лишь абстрактная часть объявления функции в отношении этой особенности. –

ответ

3

Этот код выводит false true false true на обоих GCC 4.9 и лязг 3.5 с или без исключений с поддержкой:

void foo() {} 
void bar() noexcept {} 
void foo2() noexcept(noexcept(foo())) {} 
void bar2() noexcept(noexcept(bar())) {} 

int main() { 
    std::cout << std::boolalpha << noexcept(foo()) << ' ' << noexcept(bar()) 
     << ' ' << noexcept(foo2()) << ' ' << noexcept(bar2()) << std::endl;  
} 

Demo

Так выглядит noexcept поведение не зависит от параметров компилятора по крайней мере, для них двух компиляторов.

Обновление: VS2013 doesn't support noexcept at all.

0

-fnothrow-неавтоматического Рассматривать спецификации исключения броска(), как если бы это была спецификация noexcept, чтобы уменьшить или устранить размер текста накладных относительно функции без каких-либо спецификации исключений. Если функция имеет локальные переменные типов с нетривиальными деструкторами, то спецификация исключений фактически делает функцию меньшей , поскольку очистка EH для этих переменных может быть оптимизирована. Сеантический эффект заключается в том, что исключение, выкинутое из функции с , такая спецификация исключений приводит к вызову прекратить довольно , чем неожиданно.

Так что в соответствии с gcc документацией функции броска становятся ненужными.

Это должно означать, что большее количество предметов вернётся как истина не менее

+0

Это документация для другого варианта, чем о том, о чем спрашивает ОП. Включение или отключение поддержки исключений выполняется с помощью '-fexceptions' /' -fno-exceptions'. – hvd

Смежные вопросы