C ++ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдореЗрдВ рджреЗрд╢реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж-рдореБрдХреНрдд рд╕реНрд╡реИрдк рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЙрдЗрд╕реЗрдкреНрдЯ рдореВрд╡ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдиреИрдиреНрдЯрд┐рд╡рд┐рдпрд▓ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
C ++ 11 рдореЗрдВ, рдиреЛрдПрдХреНрд╕рд╕реЗрдкреНрдЯ рдореЙрдбрд┐рдлрд╛рдпрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдиреЛрдПрдХреНрд╕рд╕реЗрдкреНрдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╢рд╛рди рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдпреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВ:
class first_resource {...}; class second_resource {...}; void release(first_resource & r) noexcept; void close(second_resource & r);
рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд first_resource
рдХреНрд▓рд╛рд╕ рд╣реИ рдЬреЛ first_resource
рдФрд░ first_resource
рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ:
class resources_owner { first_resource first_resource_; second_resource second_resource_; ... };
рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВ resources_owner
рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдБ:
resources_owner::~resources_owner() noexcept {
рдПрдХ рддрд░рд╣ рд╕реЗ, C ++ 11 рдореЗрдВ noexcept рдиреЗ C ++ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ C ++ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдиреЙрдЗрд╕реЗрд╕реЗрдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдмреБрд░рд╛ рдкрдХреНрд╖ рд╣реИ ...
рдХрдВрдкрд╛рдЗрд▓рд░ noexcept рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реБрдИ рдереА: рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореИрдВрдиреЗ release()
noexcept рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд release()
рдорд╛рдирд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдРрд╕реА рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реА release()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:
resources_owner::~resources_owner() noexcept { release(first_resource_);
рддрдм рдореИрдВ рднреАрдЦ рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдпрд╣ release()
рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдФрд░ рдореЗрд░рд╛ рдкреВрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ std::terminate()
рдХрд╛рд░рдг рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдФрд░ рднреА рдмреБрд░рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдФрд░ рдХрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ resources_owner
рд▓рд┐рдП рдРрд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ред
рдпрд╛ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рд░реВрдкрд╛рдВрддрд░ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореБрдЭрд╕реЗ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реБрдИ рдХрд┐ release()
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ noexcept рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдпрд╣ рдерд╛
рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 1.0 рдореЗрдВ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВрдиреЗ first_resource
рдФрд░ release()
ред рдФрд░ рдлрд┐рд░, рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3.0 release()
рдЕрдм рдПрдХ noexcept рд╕рдВрд╢реЛрдзрдХ рдирд╣реАрдВ рд╣реИред
рдЦреИрд░, рдХреНрдпрд╛? рдирдпрд╛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг, рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдкреАрдЖрдИ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЗрд╡рд▓ рдЕрдм, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдореИрдВ resources_owner
рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдареАрдХ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдКрдВрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдореЗрд░реЗ рдмрдЬрд╛рдп рдХреЛрдИ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рд░рд┐рд╕реЛрд░реНрд╕_рдУрдирд░ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдкрд░ рдХрднреА рдЧреМрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ release()
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдиреЛрд╕реЗрдкреНрдЯ рд╡рд┐рдзрд┐ / рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрд╡рд╛рдж-рдлреЗрдВрдХрдиреЗ рдХреА рд╡рд┐рдзрд┐ / рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗред
рдбреВрдмрдиреЗ рд╕реЗ рдмрдЪрд╛рд╡ рдЦреБрдж рдбреВрдмрдиреЗ рдХрд╛ рдХрд╛рдо рд╣реИ
рдареАрдХ рд╣реИ, рд╕рдВрдХрд▓рдХ рдХреЛрдИ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рд╕рд░рд▓ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рди рдХрд░реЗрдВред рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╕реА ++ рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгред
рдХреНрдпрд╛ рдЗрд╕рдХреА рдЪрдкреЗрдЯ рдореЗрдВ рдЖрдП рдмрд┐рдирд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдорджрдж рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдпрд╛рдиреА рдХреНрдпрд╛ рдиреЛрдЗрд╕реЗрдкреНрдЯ рддрд░реАрдХреЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдХрд░рдг рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рднрд▓реЗ рд╣реА рдбреЗрдВрдбреНрд░реЛ-рдлреЗрдХрд▓ рд╡рд┐рдзрд┐?
рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрд▓рд╛, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡ рд╣реИред
рдкреИрд░ рдХрд╣рд╛рдБ рд╕реЗ рдмрдврд╝рддреЗ рд╣реИрдВ?
рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдПрдореНрдмреЗрдбреЗрдб рдПрдЪрдЯреАрдЯреАрдкреА рд╕рд░реНрд╡рд░ рд░реЗрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреИрдпрд╛рд░реА рдХрд░рддреЗ рд╕рдордп рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ Restinio рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рднрд░рд╛ рд╣реИ, рд╣рдордиреЗ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдкрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЛрдВ рдХреА рджреГрд╖реНрдЯрд┐ рдЦреЛ рджреА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдордп рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХрднреА-рдХрднреА рдЖрд╕рд┐рдпреЛ (рдЬреЛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЙрд▓рдмреИрдХ рд╕реЗ рдмрд╛рд╣рд░ рдЙрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде, рдЕрдкрд╡рд╛рдж, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдлрд╛рдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдЙрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрднреА рднреА рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рдЛрдг рдЬрдорд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдФрд░ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдерд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╛рдиреА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЧреИрд░- noexcept рдХреЛрдб рдХреЛ noexcept рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдорджрдж рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддреБрдЪреНрдЫ рдорд╛рдорд▓рд╛:
template< typename Message_Builder > void trigger_error_and_close( Message_Builder msg_builder ) noexcept {
рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рддреБрдЪреНрдЫ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:
void reset() noexcept { RESTINIO_STATIC_ASSERT_NOEXCEPT(m_context_table.empty()); RESTINIO_STATIC_ASSERT_NOEXCEPT( m_context_table.pop_response_context_nonchecked()); RESTINIO_STATIC_ASSERT_NOEXCEPT(m_context_table.front()); RESTINIO_STATIC_ASSERT_NOEXCEPT(m_context_table.front().dequeue_group()); RESTINIO_STATIC_ASSERT_NOEXCEPT(make_asio_compaible_error( asio_convertible_error_t::write_was_not_executed)); for(; !m_context_table.empty(); m_context_table.pop_response_context_nonchecked() ) { const auto ec = make_asio_compaible_error( asio_convertible_error_t::write_was_not_executed ); auto & current_ctx = m_context_table.front(); while( !current_ctx.empty() ) { auto wg = current_ctx.dequeue_group(); restinio::utils::suppress_exceptions_quietly( [&] { wg.invoke_after_write_notificator_if_exists( ec ); } ); } } }
рдЗрди рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрдИ рдмрд╛рд░ рд╣рд╛рде рдорд┐рд▓рд╛рдпрд╛, рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдиреЙрдЗрд╕реЗрдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬреЛ рдирд╣реАрдВ рдереЗред
рддреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╕реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рд╕реЛрдкреЗрдб рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рддрд╛ рд╣реИ ... рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдЦ рдореЗрдВ рдЖрдЧреЗ, рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд░реИрд╕реНрдЯрд┐рдирд┐рдпреЛ рдХреЛрдб рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рд╛рд░
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рд╛рд░ рдХрдерди / рдСрдкрд░реЗрдЯрд░ (stmt) рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореИрдХреНрд░реЛ рдореЗрдВ, noexcept рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдореИрдХреНрд░реЛ static_assert(noexcept(stmt), msg)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ sttt рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ noexcept рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЛрдб рдореЗрдВ stmt рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рд╣реИ:
ENSURE_NOEXCEPT_STATEMENT(release(some_resource));
рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
static_assert(noexcept(release(some_resource)), "release(some_resource) is expected to be noexcept"); release(some_resource);
рдореИрдХреНрд░реЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЪреБрдирд╛рд╡ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рднреА рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдХреЛрдИ рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХреЛрдб рдореЗрдВ static_assert(noexcept(...))
рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░рд╛рдЬреВ рдХреЛ рдЯрд┐рдк рджреЗрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рддреБрд▓рдирд╛ рд╣реИ:
static_assert(noexcept(release(some_resource)), "release(some_resource) is expected to be noexcept"); release(some_resource);
рдФрд░
ENSURE_NOEXCEPT_STATEMENT(release(some_resource));
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдореБрдЦреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде, рдЕрд░реНрдерд╛рддреНред release(some_resource)
рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреЛрдб "рд░реЗрдВрдЧрдиреЗ" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рдВрдЧрдд рдХреЗ рд╕рд╛рде, рдЬрдм рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред
рджреВрд╕рд░реЗ, рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЙрдирдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реБрдП рдЪреЗрдХ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╣реЛ, рдЕрдЧрд░ static_assert-s рдХреА рдмрд╣реБрддрд╛рдпрдд рдиреЗ рд╕рдВрдХрд▓рди рдХреА рдЧрддрд┐ рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛)ред рдпрд╛, рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЬрдм рдХреБрдЫ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ static_assert рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдирджреА рдХреЗ рд╕рд╛рде рдЫрд┐рдбрд╝рдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛрдб рдХреЗ рд╕реБрдЪрд╛рд░реВ рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдлрд┐рд░ рддреАрд╕рд░реЗ рдореЗрдВ, рдЖрджрд┐ред
рддреЛ рдореИрдХреНрд░реЛрдЬрд╝, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ C ++ рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдиреА рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИрдВ, рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдЬреАрд╡рди рд╕рд░рд▓ рд╣реИред
рдореБрдЦреНрдп рдореИрдХреНрд░реЛ ENSURE_NOEXCEPT_STATEMENT
рдореБрдЦреНрдп рдореИрдХреНрд░реЛ ENSURE_NOEXCEPT_STATEMENT рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
#define ENSURE_NOEXCEPT_STATEMENT(stmt) \ do { \ static_assert(noexcept(stmt), "this statement is expected to be noexcept: " #stmt); \ stmt; \ } while(false)
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ / рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ noexcept рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдХреЙрд▓ рдХреЛ try-catch рдмреНрд▓реЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдлрд╝реНрд░реЗрдо рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
class some_complex_container { one_container first_data_part_; another_container second_data_part_; ... public: friend void swap(some_complex_container & a, some_complex_container & b) noexcept { using std::swap;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, ENSURE_NOT_NOEXCEPT_STATEMENT рдореИрдХреНрд░реЛ рднреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдмрд╛рд╣рд░ рди рдирд┐рдХрд▓реЗрдВ:
class some_resource_owner { some_resource resource_; ... public: ~some_resource_owner() noexcept { try {
рд╣реЗрд▓реНрдкрд░ рдореИрдХреНрд░реЛрдЬрд╝ STATIC_ASSERT_NOEXCEPT рдФрд░ STATIC_ASSERT_NOT_NOEXCEPT
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, ENSURE_NOEXCEPT_STATEMENT рдФрд░ ENSURE_NOT_NOEXCEPT_STATEMENT рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдХрдердиреЛрдВ / рдХрдердиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдпрд╛рдиреА рдЖрдк рдЗрд╕ рддрд░рд╣ ENSURE_NOEXCEPT_STATEMENT рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
auto resource = ENSURE_NOEXCEPT_STATEMENT(acquire_resource(params));
рдЗрд╕рд▓рд┐рдП, ENSURE_NOEXCEPT_STATEMENT рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрди рдЫреЛрд░реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ:
for(auto i = something.get_first(); i != some_other_object; i = i.get_next()) {...}
рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ get_first()
, get_next()
, рд╕рд╛рде рд╣реА i рдХреЗ рд▓рд┐рдП рдирдП рдорд╛рдиреЛрдВ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдХ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВред
рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдВ STATIC_ASSERT_NOEXCEPT рдФрд░ STATIC_ASSERT_NOT_NOEXCEPT рд▓рд┐рдЦреЗ рдЧрдП, рдЬрд┐рдирдХреЗ рдкреАрдЫреЗ рдХреЗрд╡рд▓ static_assert s рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдЗрди рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдХреЗ рд╕рдВрдХрд▓рди рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ):
STATIC_ASSERT_NOEXCEPT(something.get_first()); STATIC_ASSERT_NOEXCEPT(something.get_first().get_next()); STATIC_ASSERT_NOEXCEPT(std::declval<decltype(something.get_first())>() = something.get_first().get_next()); for(auto i = something.get_first(); i != some_other_object; i = i.get_next()) {...}
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ "рд░реЗрдВрдЧрдирд╛" рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпреЗ рд╕рд░рд▓ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдПред
Noexcept-ctcheck рдкреБрд╕реНрддрдХрд╛рд▓рдп
рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдФрд░ рдлреЗрд╕рдмреБрдХ рдкрд░ рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдШрдЯрдирд╛рдХреНрд░рдореЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рд╛ред рдЬреЛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдЬреАрдердм рдХреЗ рдкрд╛рд╕ рдЕрдм рдПрдХ рдЫреЛрдЯреЗ рд╣реЗрдбрд░-рдХреЗрд╡рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдиреЙрдЗрд╕реЗрдкреНрдЯ-рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо-рдЪреЗрдХ (рдпрд╛ рдиреЙрдЗрд╕реЗрдкреНрдЯ-рд╕реАрдЯреАрдХреЗрдЪ, рдпрджрд┐ рдЖрдк рдЕрдХреНрд╖рд░реЛрдВ рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ) рд╣реИ ред рддреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЖрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдирд╛рдо рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рд╣реИрдВред рдпрд╛рдиреА ENSURE_NOEXCEPT_STATEMENT рдХреЗ рдмрдЬрд╛рдп NOEXCEPT_CTCHECK_ENSURE_NOEXCEPT_STATEMENTред
рдХреНрдпрд╛ noexcept-ctcheck рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ (рдЕрднреА рддрдХ?)
рдореИрдХреНрд░реЛ ENSURE_NOEXCEPT_EXPRESSION рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
auto resource = ENSURE_NOEXCEPT_EXPRESSION(acquire_resource(params));
рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
#define ENSURE_NOEXCEPT_EXPRESSION(expr) \ ([&]() noexcept -> decltype(auto) { \ static_assert(noexcept(expr), #expr " is expected to be noexcept"); \ return expr; \ }())
рд▓реЗрдХрд┐рди рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрджреЗрд╣ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рд╛рде рдЕрднреА рддрдХ ENSURE_NOEXCEPT_EXPRESSION рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВ :(
рдФрд░ рдЕрдЧрд░ рдЖрдк рд╕рдкрдиреЗ рджреЗрдЦрддреЗ рд╣реИрдВ?
рдореЗрд░рд╛ рдкреБрд░рд╛рдирд╛ рд╕рдкрдирд╛ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдПрдХ рдиреЙрдЗрд╕реЗрдкреНрдЯ рдмреНрд▓реЙрдХ рд╣реЛ, рдЬрд┐рд╕рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдЦреБрдж рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рди рдХреЗрд╡рд▓ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рд╕реНрд╡реИрдк, рдЪрд╛рд▓-рд╕рдВрдЪрд╛рд▓рдХ, рд╡рд┐рдзреНрд╡рдВрд╕рдХ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ noexcept рдмреНрд▓реЙрдХ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
void modify_some_complex_data() {
рдпрд╣рд╛рдВ, рдХреЛрдб рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдиреЙрдЗрд╕реЗрдкреНрдЯ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдПрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХрддреА рд╣реИрдВред рдФрд░ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рдорджрдж рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ noexcept block рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН: рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд┐ рдХреЛрдб рдХреЗ рдХреБрдЫ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреБрдЫ рдЧреБрдг рд╣реИрдВред рдЗрд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдбреЗрдЯрд╛ рджреМрдбрд╝ рдЖрджрд┐ред
рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдерд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдФрд░ рдЙрдирдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдмрдХрд┐ рд╡рд╣ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рд╣рд┐рддреЛрдВ рдФрд░ рдЕрд╡рд╕рд░реЛрдВ рд╕реЗ рджреВрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдФрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдХреНрдХрд╛ рджреЗрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрджрд┐рдо рдореИрдХреНрд░реЛ рдореЗрд░реА рдмреЗрдЪреИрди рдиреАрдВрдж рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдФрд░ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ noexcept рддрд░реАрдХреЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ noexcept рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛, рддреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЖрдк рдХрд┐рддрдиреЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВред