
рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдБ )ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдУрдУрдкреА рдореЗрдВ рдпреВрдирд┐рдпрдВрд╕ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЫреЗрдж рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╡реЗ рдХреБрдЫ рдЕрдкреВрд░рдгреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд░рд╛рд╣рдирд╛ рдХреА рд╣реИ рдЬрдм рд╕реНрдЯреИрдиреНрдб
:: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рдорд╕реМрджреЗ рдкрд░ рдлрд░реНрдирд╛рдВрдбреЛ рдХреИрд╕рд┐рдпреЛрд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдХреНрдпрд╛ рдЖрдк
Boost.Optional рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ,
рдмрдврд╝рд╛рд╡рд╛ :: рд╡реИрдХрд▓реНрдкрд┐рдХ <рдЯреА> рдПрдХ "рдпреМрдЧрд┐рдХ" рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ
рдЯреА рдкреНрд▓рд╕ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд╛рдЬреНрдп рдХреЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ
рдЕрд╢рдХреНрдд рдЯреА рд╣реИредрдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ
:: рд╡реИрдХрд▓реНрдкрд┐рдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ "рдЦрд╛рд▓реА" рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд░рдХреЗ, рдЯрд╛рдЗрдк
рдЯреА рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ
рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЯрд╛рдЗрдк
T рдореЗрдВ рдПрдХ рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк
рдЯреА рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
template <typename T> class optional { bool initialized_; char storage_[ sizeof(T) ];
рдпрд╣ рд╕рдВрднрд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рд╕рдВрд░реЗрдЦрдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рд╣рдореЗрдВ
std :: align_storage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдЖрдк "рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рдЬреНрд╡рд╛рдЗрди" рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕ рддрдВрддреНрд░ рдХреЛ
рдПрд╕реАрд╕реАрдпреВ рдУрд╡рд░рд▓реЛрдб # 112 рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред "рдЦрд╛рд▓реА" рд░рд╛рдЬреНрдп рдФрд░ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╕реЗ" рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
optional<T>::optional(none_t)
рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
optional<T>::~optional() { if (initialized_) { static_cast<T*>(storage_) -> T::~T(); } };
рд╕рдорд╕реНрдпрд╛ рдирдВрдмрд░ 1
рдПрд╕рдЯреАрдбреА :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
рдПрд╕рдЯреАрдбреА :: рд╡реИрдХрд▓реНрдкрд┐рдХ <рдЯреА> рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрд┐рдирдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрди рд╕реАрдорд╛рдУрдВ рдкрд░ рдорд╛рдирдХ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЕрднреА рднреА рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЖрдорддреМрд░ рдкрд░ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рдпрджреНрдпрдкрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рдЯрд╛рдЗрдк
рдЯреА рдХрд╛ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рднреА рддреБрдЪреНрдЫ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐
рдЯреА =
рдЗрдВрдЯ , рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢рдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣рд╛рдВ рд╕реЗ рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдиреБрдХрд╕рд╛рди рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ
рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрдЯрд░ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдпрд╛ рдХрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ
рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрдИ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЖрдХрд╛рд░ рдХреЗ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рд╕рджрд╕реНрдп рдкреНрд░рд╛рд░рдВрдн рд╕реВрдЪреА (рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рдордиреЗ) рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо "рдЦрд╛рд▓реА" рд░рд╛рдЬреНрдп рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рднрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдпрд╣ рд╕рднреА рдУрд╡рд░рд╣реЗрдб рд╣реИред рд╣рдореЗрдВ
std :: align_storage рдХреЗ рд╕рд╛рде рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛
рд╣реЛрдЧреА ред рдФрд░ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдирдиреНрдп рдЬреЙрдЗрди (ACCU рдУрд╡рд░рд▓реЛрдб # 112 рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
template <typename T> class optional { bool initialized_; union { T storage_ };
рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдЧ рдХрд╛ "рдЦрд╛рд▓реА" рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╛ рддреЛ рдЕрдирд╛рдо рдпреВрдирд┐рдпрди рдХреЛ
рдЕрд╕рдВрдЧрдард┐рдд (рдЬреЛ рдХрд┐
рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ) рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛
рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдп рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдЯреАред
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 2
рд╣рдорд╛рд░реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рдЕрдиреНрдп рд▓рдХреНрд╖реНрдп рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рд╕реЗ рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП
T рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд
std :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреА рддрд░рд╣ , рдСрдкрд░реЗрдЯрд░ "*" (
рдСрдкрд░реЗрдЯрд░ * ) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рд╕реАрдзреЗ рдЯрд╛рдЗрдк
рдЯреА рдХреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ
ред explicit optional<T>::operator bool() const
рдЙрд╕реА рд╕рдордп, рд╣рдо
рд╕рдВрдЪрд╛рд▓рдХ рдЪрд░рдг рдореЗрдВ
рдСрдкрд░реЗрдЯрд░ * рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рдЕрдирдзрд┐рдХреГрдд рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдЕрд╕рдлрд▓ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдкрд░
рдореЗрд░реЗ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдХрд░реНрд╖рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
constexpr explicit optional<T>::operator bool() { return initialized_; }; constexpr T const& optional<T>::operator*() { return bool(*this) ? *static_cast<T*>(storage_) : throw uninitialized_optional(); }
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╡рд╣ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рднреА рд╣реЛрдЧрд╛, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рдЪреЗрдХ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдг рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ?
рдирд┐рд░реНрдгрдп
рдЗрди рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ
рдЯреА- рдкреНрд░рдХрд╛рд░ рд╕рдВрдШ рдФрд░ рдПрдХ рд╕реНрдЯрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
struct dummy_t{}; template <typename T> union optional_storage { static_assert( is_trivially_destructible<T>::value, "" ); dummy_t dummy_; T value_; constexpr optional_storage()
рдирд┐рд░рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд╣реИрдВред рд╣рдореЗрдВ рд╕рдВрдШ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХреЛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ)ред рдЗрд╕ рд╕рджрд╕реНрдп рдХреЛ "рд╕рдХреНрд░рд┐рдп" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рдЦрд╛рд▓реА рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╣рдо рд╕реНрдЯрдм рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рднреА рдФрдкрдЪрд╛рд░рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ
рдбрдореА_рдЯ рд╕реНрдЯрдм рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд░рдВрднреАрдХрд░рдг рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛: рд╕рдВрдШ рдХреЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рджрд╕реНрдп рдХреЗ рдкрдврд╝рдиреЗ (рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, "
рд▓рд╡рд▓реНрдпреВ-рдЯреВ-рд░рд┐рд╡рд▓реНрдпреВ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо" рдХрд╣рддреЗ рд╣реИрдВ) рдПрдХ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
constexpr optional_storage<int> oi{1};
рдЕрдм рд╣рдорд╛рд░реЗ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдЧ (рддреБрдЪреНрдЫ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП
T ) рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
template <typename T>
рдСрдкрд░реЗрдЯрд░ * рдореЗрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ: рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рдВрдШ рдХреЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рджрд╕реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдореВрд▓реНрдп рддрдХ рдЧрд▓рдд рдкрд╣реБрдВрдЪ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЖрдк
std рдХрд╛ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ
:: рдпрд╣рд╛рдБ
рд╡реИрдХрд▓реНрдкрд┐рдХ :
github.com/akrzemi1/optional