2015-07-03 5 views
17

Следующая статья обсуждает тип выражения throw: In C++, if throw is an expression, what is its type?. Я хотел бы прояснить более общую вещь: почему должно быть throw выражением, а не выражением (не-выражение), как, например, return? Я хочу сказать, кто-нибудь захочет написать что-то вроде auto x = throw std::runtime_error("Error message")?Зачем бросать выражение?

ответ

11

Если throw были заявлением, вы не могли использовать его с условным оператором.

return success() 
    ? computation() 
    : throw std::runtime_error("oops"); 

Примечание: это может или не может иметь применения за пределами запутывания кода.

Редактировать: один полезный случай находится внутри C++ 11 строгих constexpr функций, которые могут содержать только одну инструкцию. Спасибо @dyp за понимание!

+0

Другое +1 для примечания, которое я бы ценю, комментируя. Похоже, я не могу дважды проголосовать :( – AlwaysLearning

+0

Плюс один, хотя стоит заметить, что 'throw std :: runtime_error (" oops ")' является выражением типа 'void' и работает только в условном из-за некоторой технической обманки что не позволяет мне отвечать на это сам. – Bathsheba

+0

@ Bathsheba 'return throw std :: runtime_error (" oops "), 0;' работает тоже (спасибо, оператор запятой из космоса!) – Quentin

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