Size: a a a

2021 February 25

IZ

Ilia Zviagin in supapro.cxx
Mikhail Kalugin
Потому, что это значит что ничто изнутри (включая контейнеры и все такое прочее) не выкинет исключение никогда (контейнеры могут, но спецификация это пытается запретить)?
+
источник

MK

Mikhail Kalugin in supapro.cxx
Андрей
Я понял что это для оптимизации и локализации точки падения
Да, в основном для оптимизации - мы как бы проводим границу говорим: «исключение никогда не перейдет эту границу», и компилятор может не создавать код передачи исключения от этого места дальше.
источник

IZ

Ilia Zviagin in supapro.cxx
Андрей
Я понял что это для оптимизации и локализации точки падения
НЕ для локализации
источник

А

Андрей in supapro.cxx
Ilia Zviagin
НЕ для локализации
Мы можем посмотреть сразу в то место где была перейдена граница, разве не так?
источник

MK

Mikhail Kalugin in supapro.cxx
Андрей
Мы можем посмотреть сразу в то место где была перейдена граница, разве не так?
И да и нет. Мы обязаны обработать все исключения до пересечения этой границы.
источник

MK

Mikhail Kalugin in supapro.cxx
Андрей
Мы можем посмотреть сразу в то место где была перейдена граница, разве не так?
В лучшем случае, попытка перейти эту границу просто не скомпилируется. В худшем, исключения просто будут исчезать и все будет работать очень странно.
источник

IZ

Ilia Zviagin in supapro.cxx
Андрей
Мы можем посмотреть сразу в то место где была перейдена граница, разве не так?
Разве не так.
источник

AB

Artöm Bakri Al-Sarmi... in supapro.cxx
Mikhail Kalugin
Да, в основном для оптимизации - мы как бы проводим границу говорим: «исключение никогда не перейдет эту границу», и компилятор может не создавать код передачи исключения от этого места дальше.
Он обязан создать вызов std::terminate
источник

А

Андрей in supapro.cxx
Artöm Bakri Al-Sarmini
Он обязан создать вызов std::terminate
Это понятно
источник

AB

Artöm Bakri Al-Sarmi... in supapro.cxx
Mikhail Kalugin
В лучшем случае, попытка перейти эту границу просто не скомпилируется. В худшем, исключения просто будут исчезать и все будет работать очень странно.
Такое возможно только при вызове из extern "C" контекста
источник

MK

Mikhail Kalugin in supapro.cxx
Artöm Bakri Al-Sarmini
Он обязан создать вызов std::terminate
А ну да - сценарий «все пропало»
источник

AB

Artöm Bakri Al-Sarmi... in supapro.cxx
Там не будет стектрейса, но будет гарантированное падение
источник

А

Андрей in supapro.cxx
Mikhail Kalugin
В лучшем случае, попытка перейти эту границу просто не скомпилируется. В худшем, исключения просто будут исчезать и все будет работать очень странно.
Не скомпилируется тогда когда мы добавили условия в noexcept. А когда исключения могут исчезнуть?
источник

MK

Mikhail Kalugin in supapro.cxx
Андрей
Не скомпилируется тогда когда мы добавили условия в noexcept. А когда исключения могут исчезнуть?
А, тут я перепутал немного: это происходит на границах контекстов C и C++ - C не знает об исключениях.
источник

А

Андрей in supapro.cxx
Artöm Bakri Al-Sarmini
Там не будет стектрейса, но будет гарантированное падение
А вот в throw() по моему есть стэктрейс
источник

AB

Artöm Bakri Al-Sarmi... in supapro.cxx
Андрей
А вот в throw() по моему есть стэктрейс
В зависимости от стандарта noexcept и throw() могут быть одним и тем же или разным
источник

MK

Mikhail Kalugin in supapro.cxx
Андрей
А вот в throw() по моему есть стэктрейс
std::terminate значит: «прекратить все немедленно» будет при этом unwind или нет зависит от компилятора.
источник

А

Андрей in supapro.cxx
Спасибо за ответы:
@benRabi
@MasterZiv
@das_3sz3tt
источник

YB

YEgor Briz in supapro.cxx
Всем привет. Я могу использовать два типа переменных в for? как-нибуть так: for(int i = 0, char *r = c; *r, r++, i++)?
источник

IZ

Ilia Zviagin in supapro.cxx
YEgor Briz
Всем привет. Я могу использовать два типа переменных в for? как-нибуть так: for(int i = 0, char *r = c; *r, r++, i++)?
Нет
источник