Russian Qt Forum
Ноябрь 22, 2024, 11:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование спецификатора noexcept  (Прочитано 4970 раз)
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« : Январь 09, 2017, 18:03 »

Всем привет! Вопрос: Имеет ли смысл объявлять функции как noexcept, если проект собирается без исключений? Если да, то почему?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 09, 2017, 20:52 »

ИМХО, не имеет. Единственное, это могут потребовать виртуальные методы с noexcept, которые ты переопределяешь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Январь 16, 2017, 15:03 »

Выписка из лекции Полубенцевой М.И.:

Как компилятор использует noexcept
Важно!
• Спецификация noexcept – это способ для
программиста предоставить компилятору
информацию о том, что функция не будет
генерировать исключения
• Получив информацию о том, что функция
безопасна, компилятор может использовать
дополнительные оптимизации
• Например, некоторые контейнеры (vector)
поддерживают перемещение элементов только в
том случае, когда move конструктор noexcept, а в
противном случае вызывают глубокое копирование

Специфика noexcept
• Спецификатор времени компиляции
noexcept значительно уменьшает размер
итогового файла и ускоряет работу
программы.
• => полезно его использовать «по делу»!!!
• если функция со спецификатором noexcept
все-таки сгенерирует исключение, то будет
вызвана std::terminate() => аварийное
завершение.

Код
C++ (Qt)
struct Bad{
Bad() {}
Bad(Bad&&); // из сигнатуры не следует, что функция безопасна
=> компилятор исходит из того, что может генерировать исключения
Bad(const Bad&); // аналогично
};
int main()
{
Bad b;
Bad b2 = std::move_if_noexcept(b); // Bad(const Bad&)
}

Код
C++ (Qt)
struct Good{
Good() {}
Good(Good&&) noexcept; // не генерирует исключений!
Good(const Good&) noexcept; // тоже не генерирует исключений!
};
int main()
{
Good g;
Good g2 = std::move_if_noexcept(g); // Good(Good&&)
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 22.