Следующая статья обсуждает тип выражения throw
: In C++, if throw is an expression, what is its type?. Я хотел бы прояснить более общую вещь: почему должно быть throw
выражением, а не выражением (не-выражение), как, например, return
? Я хочу сказать, кто-нибудь захочет написать что-то вроде auto x = throw std::runtime_error("Error message")
?Зачем бросать выражение?
17
A
ответ
11
Если throw
были заявлением, вы не могли использовать его с условным оператором.
return success()
? computation()
: throw std::runtime_error("oops");
Примечание: это может или не может иметь применения за пределами запутывания кода.
Редактировать: один полезный случай находится внутри C++ 11 строгих constexpr
функций, которые могут содержать только одну инструкцию. Спасибо @dyp за понимание!
Смежные вопросы
- 1. C# зачем бросать ошибки
- 2. Зачем бросать в интерфейс?
- 3. Исключение - зачем даже бросать?
- 4. HttpClient.PostAsync - Зачем это бросать ArgumentException
- 5. Зачем бросать CannotResolveClassException на XStream?
- 6. Зачем бросать строку в строку?
- 7. Что значит «бросать» пустое выражение?
- 8. Зачем бросать курсор, а затем разыгрывать?
- 9. Зачем бросать объект перед тестированием для NSNull?
- 10. java.io.Closeable: зачем бросать RuntimeException в close() работает?
- 11. Зачем бросать ThreadAbortException не убивает процесс?
- 12. Зачем бросать в Closeable в первую очередь?
- 13. Зачем это бросать Uncaught TypeError: Незаконный вызов
- 14. Зачем бросать локальную переменную invokes move constructor?
- 15. Зачем бросать два раза в этой строке?
- 16. Зачем REGEXP_REPLACE бросать непереводимый символ? Это ошибка?
- 17. Зачем бросать объект по сравнению с нулевым?
- 18. Зачем компилировать выражение XPath?
- 19. Зачем заменять регулярное выражение?
- 20. Бросать или не бросать
- 21. Зачем бросать нуль в переменные в код очистки?
- 22. Зачем бросать стол в Кассандру на много минут?
- 23. Зачем бросать старые значения при каждой обратной передаче?
- 24. Зачем бросать сообщение об ошибке: указанный прилив недействителен?
- 25. Зачем бросать исключение в Prolog вместо простого провала?
- 26. Зачем использовать double.Parse, а затем бросать в поплавок?
- 27. Зачем кому-то бросать вместо того, чтобы возвращать подтип
- 28. Зачем использовать double, а затем бросать, чтобы плавать?
- 29. Зачем бросать на уловы производного класса по базе?
- 30. Зачем нам нужно бросать то, что возвращается malloc?
Другое +1 для примечания, которое я бы ценю, комментируя. Похоже, я не могу дважды проголосовать :( – AlwaysLearning
Плюс один, хотя стоит заметить, что 'throw std :: runtime_error (" oops ")' является выражением типа 'void' и работает только в условном из-за некоторой технической обманки что не позволяет мне отвечать на это сам. – Bathsheba
@ Bathsheba 'return throw std :: runtime_error (" oops "), 0;' работает тоже (спасибо, оператор запятой из космоса!) – Quentin