Następujący post omawia typ wyrażenia throw
: In C++, if throw is an expression, what is its type?. Chciałbym wyjaśnić bardziej podstawową rzecz: dlaczego powinno być throw
być wyrażeniem, a nie (bezwyrażenia) oświadczeniem, tak jak w pierwszej kolejności, tak jak return
? Czy ktoś chciałby napisać coś w stylu auto x = throw std::runtime_error("Error message")
?Dlaczego wyrzucasz wyrażenie?
17
A
Odpowiedz
11
Jeśli throw
było stwierdzeniem, że nie można go użyć z operatorem warunkowym.
return success()
? computation()
: throw std::runtime_error("oops");
Uwaga: to może lub nie może mieć zastosowania poza kodu zaciemniania.
Edycja: jeden przydatny przypadek jest wewnątrz ścisłych funkcji C++ 11 constexpr
, które mogą zawierać tylko jedną instrukcję. Dzięki @dyp za wgląd!
Powiązane problemy
- 1. SetJmp/LongJmp: Dlaczego wyrzucasz segfault?
- 2. Dlaczego to wyrażenie zwraca wartość true?
- 3. Dlaczego to wyrażenie jest bez znaku?
- 4. Dlaczego Python nieprawidłowo ocenia to wyrażenie?
- 5. Dlaczego czysty kod zabronić else wyrażenie
- 6. Dlaczego to wyrażenie "dopasuj" F #/OCaml?
- 7. Dlaczego moje potrójne wyrażenie nie działa?
- 8. Dlaczego to wyrażenie Haskella jest takie wolne?
- 9. Dlaczego wyrażenie inicjujące kolekcję wymaga implementacji IEnumerable?
- 10. Dlaczego to proste wyrażenie warunkowe nie działa?
- 11. Dlaczego "wyrażenie nie można przypisać" (UIView.frame.origin)?
- 12. Dlaczego to wyrażenie regularne javascript nie działa?
- 13. Dlaczego wyrażenie 011 == 11 ocenia jako fałszywe?
- 14. CS1525: Nieprawidłowe wyrażenie wyrażenie ")"
- 15. Przekształcanie wyrażenie LaTeX Infix wyrażenie
- 16. Dlaczego ReSharper mówi mi, że to wyrażenie jest zawsze prawdziwe?
- 17. Dlaczego to wyrażenie jest ocenione jako "a" w JavaScript?
- 18. W C, dlaczego wyrażenie (Statement) zbiegające przecinek (,) operator działa inaczej
- 19. Dlaczego wyrażenie wyboru pozycji xpath zwraca wiele węzłów?
- 20. Dlaczego Clojure's for macro akceptuje tylko jedno wyrażenie ciała?
- 21. Dlaczego grupa wyrażenie regularne za „non-przechwytywanie” nie działa
- 22. Dlaczego wyrażenie RegExp z flagą globalną podaje nieprawidłowe wyniki?
- 23. Dlaczego wyrażenie na żywo musi być ocenione w jQuery
- 24. Python wyrażenie regularne remix, dlaczego ten kod nie działa?
- 25. Dlaczego wyrażenie (0 == 0 & 1 == 1) jest oceniane jako Fałsz?
- 26. OCaml wyrażenie logiczne [[]] == [[]]
- 27. Jak przekonwertować wyrażenie Foreach na wyrażenie linq?
- 28. Sprawdzanie, czy wyrażenie zawiera "samotny" parametr Wyrażenie
- 29. Wyrażenie wyrażenie do usunięcia eonu ze stringa
- 30. Wyrażenie Lambda
Kolejne +1 za notatkę, którą byłbym wdzięczny za komentarz. Wygląda na to, że nie mogę dwukrotnie głosować :( – AlwaysLearning
Plus, choć warto zauważyć, że 'throw std :: runtime_error (" oops ")' jest wyrażeniem typu 'void' i działa tylko warunkowo z powodu pewnych technicznych sztuczek to uniemożliwia mi odpowiedź na to pytanie – Bathsheba
@ Backsheba 'return throw std :: runtime_error (" oops "), 0;' działa też (dziękuje, operator przecinka z kosmosu!) – Quentin