
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢
рд╕реА ++ 11 рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд╛рд░рдг, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХрддрд╛ рдХреА рдХрдореА рд╕реЗ, рдмреВрд╕реНрдЯрд░ рдиреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ C ++ 98 / C ++ 03 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдорд╛рдирдХ C ++ 11 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
Static_assert ,
noexcept ,
countof рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рднреА, рд╕рднреА рдЧреИрд░-рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд╕рдВрдХрд▓рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╛рдирдХрд╛рд░реА рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдпрд╣
core.h рдХрд╛ рд╡рд░реНрдгрди рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣
nullptr рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдмреЗрд╕рдмреНрд░реА рдФрд░ рдЧреИрд░-рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЬ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде GitHub рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
рдХрдорд┐рдЯ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
рддреЛ, рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рдкрд░рд┐рдЪрдпрдЕрдзреНрдпрд╛рдп 1. рд╡реАрдЖрдИрдПрдо рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╡рдбреЗрдВрд╕рдЕрдзреНрдпрд╛рдп 2. #ifndef __CPP11_SUPPORT__ #define __COMPILER_SPECIFIC_BUILT_IN_AND_MACRO_HELL__ #endifрдЕрдзреНрдпрд╛рдп 3. рд╕рд╣реА nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдБрдврдирд╛рдЕрдзреНрдпрд╛рдп 4. рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ....
рек.рез рд╣рдо рдЫреЛрдЯреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ....
рек.реи рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдиреА рдЪрдорддреНрдХрд╛рд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ....
рек.рей рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдСрд▓-рдСрд▓-рдСрд▓....
4.4 рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдЕрдзреНрдпрд╛рдп 5
...
рдЕрдзреНрдпрд╛рдп 3. рд╕рд╣реА nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдБрдврдирд╛
рдЧреИрд░-рдорд╛рдирдХ рд╕рдВрдХрд▓рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ "рдЕрджреНрднреБрдд" рдЦреЛрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдорд╣рд╛рдХрд╛рд╡реНрдп рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛, рдореИрдВ рдЕрдВрдд рдореЗрдВ
рдирд▓реНрдЯреНрд░рдкреНрд░ рдЬреЛрдбрд╝ рд╕рдХрддрд╛
рд╣реВрдВ рдФрд░ рдпрд╣ рдореЗрд░реА рдЖрддреНрдорд╛ рдХреЛ рдЧрд░реНрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЖрдк рдЗрди рд╕рднреА рддреБрд▓рдирд╛рдУрдВ рдХреЛ 0 рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
NULL рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
nullptr рдХреЛ рд▓рд╛рдЧреВ
рдХрд░рддреЗ рд╣реИрдВ#define nullptr 0
рдФрд░ рдпрд╣ рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ
рдЕрд╢рдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рд╛рде 0 рдХреЛ рдмрджрд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рд╕рдм рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреЗрдХ рд▓рд┐рдЦрдирд╛ рди рднреВрд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЕрдЪрд╛рдирдХ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛:
#ifndef nullptr #define nullptr 0 #else #error "nullptr defined already" #endif
рдкреВрд░реНрд╡рдкреНрд░рдХреНрд░рдордХ рдирд┐рд░реНрджреЗрд╢
#error рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдорд╛рдирд╡-рдкрдардиреАрдп рдкрд╛рда рдХреЗ рд╕рд╛рде
рдПрдХ рддреНрд░реБрдЯрд┐
рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдФрд░, рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдорд╛рдирдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреБрд░реНрд▓рдн рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдорд╛рдирдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН
std :: nullptr_t - рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рдЙрджрд╛рд╣рд░рдг
nullptr рд╣реИ ред рдФрд░ рдХреНрд░реЛрдорд┐рдпрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдПрдХ рдмрд╛рд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛
рдХреЛ рд╣рд▓
рдХрд░рдиреЗ рдХреА рднреА
рдХреЛрд╢рд┐рд╢ рдХреА (рдЕрдм рдПрдХ рдирдпрд╛ рд╕рдВрдХрд▓рдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп
рдирд▓реНрдЯреНрд░рдкреНрд░рдЯрд░ рд╣реИ ) рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐, рдорд╛рдирдХ рд░реВрдк рд╕реЗ,
рдирд▓реНрдЯреНрд░рдкреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░
рд╢реВрдиреНрдп * рдореЗрдВ рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рд╣рдо рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рдЕрд╢рдХреНрдд рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рдорд╛рдирдХреАрдХреГрдд" рдХрд░рддреЗ рд╣реИрдВ:
class nullptr_t_as_class_impl { public: nullptr_t_as_class_impl() { } nullptr_t_as_class_impl(int) { }
рдХрд┐рд╕реА рднреА рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдЯрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдЧрд░
nullptr рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
рдЪрд╛рд░ * my_pointer; if (my_pointer == nullptr) рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
if (my_pointer == nullptr.operator char * ()) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рдЬреЛ рд╕реВрдЪрдХ рдХреА рддреБрд▓рдирд╛ 0. рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдмрд┐рдВрджреБ рд╕реЗ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ
рдмрд┐рдВрджреБ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдмреЛрд░рд▓реИрдВрдб рд╕реА ++ рдмрд┐рд▓реНрдбрд░ 6.0 "рдЦреБрдж рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд", рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдЯрд░ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ
рдирд▓реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рд╕реВрдЪрдХ (рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ)ред рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ:
class nullptr_t_as_class_impl1 { public: nullptr_t_as_class_impl1() { } nullptr_t_as_class_impl1(int) { }
рдЗрд╕
nullptr рджреГрд╢реНрдп рдХреЗ рдлрд╛рдпрджреЗ рдпрд╣ рд╣реИрдВ рдХрд┐ рдЕрдм
std :: nullptr_t рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИред рдиреБрдХрд╕рд╛рди?
Nullptr рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди
рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
unsigned* case5 = argc > 2 ? (unsigned*)0 : nullptr;
рдФрд░ рдореИрдВ "рдФрд░ рдЪреЗрдХрд░реНрд╕ рдФрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред" рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
рдПрдирдо ред C ++ рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ
int рдореЗрдВ рднреА рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ)ред рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рд╕рджрд╕реНрдп рдХреА рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд "рд╡рд┐рд╢реЗрд╖" 0 рдЬреЛ
рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП
nullptr рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЖрдо
рдЗрдВрдЯ рд╣реИ ред рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░
nullptr рдХрд╛ рдРрд╕рд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рднреА рдХреБрдЫ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдерд╛ред рдЖрдЗрдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВ:
#ifdef NULL #define STDEX_NULL NULL #else #define STDEX_NULL 0 #endif namespace ptrdiff_detail { using namespace std; } template<bool> struct nullptr_t_as_ulong_type { typedef unsigned long type; }; template<> struct nullptr_t_as_ulong_type<false> { typedef unsigned long type; }; template<bool> struct nullptr_t_as_ushort_type { typedef unsigned short type; }; template<> struct nullptr_t_as_ushort_type<false> { typedef nullptr_t_as_long_type<sizeof(unsigned long) == sizeof(void*)>::type type; }; template<bool> struct nullptr_t_as_uint_type { typedef unsigned int type; }; template<> struct nullptr_t_as_uint_type<false> { typedef nullptr_t_as_short_type<sizeof(unsigned short) == sizeof(void*)>::type type; }; typedef nullptr_t_as_uint_type<sizeof(unsigned int) == sizeof(void*)>::type nullptr_t_as_uint; enum nullptr_t_as_enum { _nullptr_val = ptrdiff_detail::ptrdiff_t(STDEX_NULL), _max_nullptr = nullptr_t_as_uint(1) << (CHAR_BIT * sizeof(void*) - 1) }; typedef nullptr_t_as_enum nullptr_t; #define nullptr nullptr_t(STDEX_NULL)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рд╕рджрд╕реНрдп
nullptr = 0 рдХреЗ рд╕рд╛рде
enum nullptr_t рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреЛрдбред рдкрд╣рд▓реЗ,
NULL рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕реЗ
рдорд╛рдирдХ рд╣реЗрдбрд░ рдХреА рдПрдХ
рдареЛрд╕ рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЦреЗрд▓рдирд╛ рдФрд░ рдЬрд╛рдВрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рджреВрд╕рд░реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реА ++ рдореЗрдВ
рдПрдирдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдЕрд░реНрдерд╛рддреНред рдПрдиреНрдпреВрдорд░реЗрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд┐рд╕реА рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкреНрд░реЛрд╡рд┐рдЬрд╝реЛ рдХреЗ рд╕рд╛рде рдХрд┐ рдпреЗ рдкреНрд░рдХрд╛рд░
рдЗрдВрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╢рд░реНрддреЗ рдХрд┐
рдПрдирдо рдорд╛рди рдЗрд╕рдореЗрдВ
рдлрд┐рдЯ рд╣реЛ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк
enum test {_1, _2} рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ
, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
, рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐
рдЖрдХрд╛рд░ ( рдкрд░реАрдХреНрд╖рдг ) ! = Sizeof (рд╢реВрдиреНрдп) ред рдорд╛рдирдХ рдХрд╛
рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдирд▓реНрдЯреНрд░рдкреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░
nullptr_t_as_enum рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрд░рд╛рдмрд░
рдЖрдХрд╛рд░ рдХрд╛ (рд╢реВрдиреНрдп *) ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
nullptr_t_as ... рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдореЗрдВ рддрддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдЗрд╕ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
рдореИрдВ рдорд╛рдирдХ рдЬрд▓рд╡рд╛рдпреБ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореИрдХреНрд░реЛ CHAR_BIT рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдореИрдХреНрд░реЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╡рд░реНрддрдорд╛рди рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐ рдмрд┐рдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдПрдХ рдЙрдкрдпреЛрдЧреА рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдкрд░ рдЪрд┐рдкрдХ рдХрд░ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд░реВрдк рд╕реЗ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ 8 рдмрд┐рдЯреНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИрдВ ред
рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛
рдПрдирдПрд▓рдПрдо рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
рдПрдирдо рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдХреБрдЫ рд╕рдВрдХрд▓рдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ (рдФрд░ рдЙрдирдХреА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐
NULL рдХреЛ "рдЧреИрд░-рдЕрдиреБрдХреНрд░рдордгрдХ"
рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп
ptrdiff_detail рдХреЛ рдорд╛рдирдХ
рдирд╛рдо рд╕реНрдерд╛рди рд▓реЗрддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рд╢реЗрд╖ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдФрд░ рдлрд┐рд░ рд╕рдВрдХрд▓рдХ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
NULL рдХреЛ
std рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
:: ptrdiff -t - C ++ рдореЗрдВ рдПрдХ рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛
рдЕрдкреНрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░, рдЬреЛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред (рдШрдЯрд╛рд╡) рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ
std :: size_t (
std :: intptr_t C ++ 11 рдореЗрдВ)ред
SFINAE
рдпрд╣рд╛рдБ, рдореЗрд░реА рдХрд╣рд╛рдиреА рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рд░, рд╣рдореЗрдВ C ++ рдореЗрдВ рдРрд╕реА рдШрдЯрдирд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдлрд▓рддрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ (SFINA) ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╕рдВрдХрд▓рдХ тАЬрдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбтАЭ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕рднреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд╣рд▓реА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рдпрд╛ рдкрд╣рд▓реЗ рдЙрдкрдпреБрдХреНрдд рдЕрдзрд┐рднрд╛рд░ рдХреЗ рдмрд╛рдж рд░реБрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рд╕реЗ
рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХрд╛ рд╕рдВрджреЗрд╢ рдЖрддрд╛
рд╣реИ , рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рдЕрдзрд┐рднрд╛рд░ рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдорд╛рди рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рдЙрдкрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рд╕рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ "рдореИрдЬрд┐рдХ" рдХреЗ рд╢реЗрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рд╡реИрд╕реЗ hi
std :: enable_if ), рдФрд░ рдпрд╣ рдмреВрд╕реНрдЯ рдФрд░ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЛрдиреЛрдВ рдХрд╛ рдЖрдзрд╛рд░ рднреА рд╣реИред
рдЪреВрдВрдХрд┐, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ
nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ
, рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ SFINAE рдХрд╛ рдЪрдпрди "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда" рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдиреАрдЪреЗ рдШреЛрд╖рд┐рдд рдЬрд╛рдВрдЪ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ
рдЖрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП "рд╣рд╛рдБ" рдФрд░ "рдирд╣реАрдВ" рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
namespace nullptr_detail { typedef char _yes_type; struct _no_type { char padding[8]; }; struct dummy_class {}; _yes_type _is_convertable_to_void_ptr_tester(void*); _no_type _is_convertable_to_void_ptr_tester(...); typedef void(nullptr_detail::dummy_class::*dummy_class_f)(int); typedef int (nullptr_detail::dummy_class::*dummy_class_f_const)(double&) const; _yes_type _is_convertable_to_member_function_ptr_tester(dummy_class_f); _no_type _is_convertable_to_member_function_ptr_tester(...); _yes_type _is_convertable_to_const_member_function_ptr_tester(dummy_class_f_const); _no_type _is_convertable_to_const_member_function_ptr_tester(...); template<class _Tp> _yes_type _is_convertable_to_ptr_tester(_Tp*); template<class> _no_type _is_convertable_to_ptr_tester(...); }
рдпрд╣рд╛рдВ рд╣рдо рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░рдЯреЙрдк рдФрд░ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдЯрд░реНрди рдСрдл рд╡реИрд▓реНрдпреВ (рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рд╛рд░ ) рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди COUNTOF_REQUIRES_ARRAY_ARGUMENT рд╣реИ ред
template<class T> struct _is_convertable_to_void_ptr_impl { static const bool value = (sizeof(nullptr_detail::_is_convertable_to_void_ptr_tester((T) (STDEX_NULL))) == sizeof(nullptr_detail::_yes_type)); };
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЯрд╛рдЗрдк
рдЯреА рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде
_is_convertable_to_void_ptr_tester рдХреЗ рдУрд╡рд░рд▓реЛрдб рдХреЛ "
iterates " рдХрд░рддрд╛ рд╣реИ рдФрд░
NULL рдХрд╛ рдорд╛рди (рдПрдХ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдмрд╕
рдлреБрд▓ рдЯрд╛рдЗрдк- T рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдХреЗрд╡рд▓ рджреЛ рдЕрдзрд┐рднрд╛рд░ рд╣реИрдВ -
рд╢реВрдиреНрдп * рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдФрд░
рдЪрд░ рддрд░реНрдХ рд╕реВрдЪреА (...) рдХреЗ рд╕рд╛рде ред рдЗрди рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рд▓реЗ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП
рд╢реВрдиреНрдп рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ , рдФрд░ рджреВрд╕рд░рд╛ рдпрджрд┐ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдЖрдХрд╛рд░
рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ (
sizeof ) ( _no_type ) == 8 ,
sizeof ( _yes_type = = 1 ), рд╣рдо рдЙрд╕ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рдХ рдиреЗ рдЙрдард╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдкреНрд░рдХрд╛рд░
рд╢реВрдиреНрдп рдореЗрдВ
рд╣реИ рдпрд╛ рдирд╣реАрдВред
рд╣рдо рдЙрд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐
nullptr_t рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдкрд╕рдВрдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рд╕реА рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ
(T) ( STDEX_NULL ) nullptr рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ)ред
template<class T> struct _is_convertable_to_member_function_ptr_impl { static const bool value = (sizeof(nullptr_detail::_is_convertable_to_member_function_ptr_tester((T) (STDEX_NULL))) == sizeof(nullptr_detail::_yes_type)) && (sizeof(nullptr_detail::_is_convertable_to_const_member_function_ptr_tester((T) (STDEX_NULL))) == sizeof(nullptr_detail::_yes_type)); }; template<class NullPtrType, class T> struct _is_convertable_to_any_ptr_impl_helper { static const bool value = (sizeof(nullptr_detail::_is_convertable_to_ptr_tester<T>((NullPtrType) (STDEX_NULL))) == sizeof(nullptr_detail::_yes_type)); }; template<class T> struct _is_convertable_to_any_ptr_impl { static const bool value = _is_convertable_to_any_ptr_impl_helper<T, int>::value && _is_convertable_to_any_ptr_impl_helper<T, float>::value && _is_convertable_to_any_ptr_impl_helper<T, bool>::value && _is_convertable_to_any_ptr_impl_helper<T, const bool>::value && _is_convertable_to_any_ptr_impl_helper<T, volatile float>::value && _is_convertable_to_any_ptr_impl_helper<T, volatile const double>::value && _is_convertable_to_any_ptr_impl_helper<T, nullptr_detail::dummy_class>::value; }; template<class T> struct _is_convertable_to_ptr_impl { static const bool value = ( _is_convertable_to_void_ptr_impl<T>::value == bool(true) && _is_convertable_to_any_ptr_impl<T>::value == bool(true) && _is_convertable_to_member_function_ptr_impl<T>::value == bool(true) ); };
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рднреА рдмреЛрдзрдЧрдореНрдп рдФрд░ рдЕрдирд┐рд░реНрд╡рдЪрдиреАрдп рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ
рдЕрд╕реНрдерд┐рд░ рдФрд░
рдХрд╛рдВрд╕реНрдЯреАрдлрд╛рдпрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдЗрди 9 рдЪреЗрдХреЛрдВ (рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рджреЛ, рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдПрдХ
рд╢реВрдиреНрдп рдкрд░ , рд╕рд╛рдд рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХ рдкрд░) рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ (* khe-khe * ... Borland Builder 6.0 ... * khe *) рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рдмреАрдЪ рд╕рдВрдХреЗрдд рдореЗрдВ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд╣рд╛рдпрдХ рдЪреЗрдХ рд▓рд┐рдЦреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
nullptr_t рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░
рд╕рдХреЗрдВред рдЕрдЧрд░ рдЬрд░реВрд░рдд рд╣реЛ
struct _member_ptr_is_same_as_ptr { struct test {}; typedef void(test::*member_ptr_type)(void); static const bool value = _is_convertable_to_void_ptr_impl<member_ptr_type>::value; }; template<bool> struct _nullptr_t_as_class_chooser { typedef nullptr_detail::nullptr_t_as_class_impl type; }; template<> struct _nullptr_t_as_class_chooser<false> { typedef nullptr_detail::nullptr_t_as_class_impl1 type; };
рдФрд░ рдлрд┐рд░ рдпрд╣ рдХреЗрд╡рд▓
nullptr_t рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреА
рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рдВрдХрд▓рдХ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
Nullptr_t рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдирдирд╛ template<bool> struct _nullptr_choose_as_int { typedef nullptr_detail::nullptr_t_as_int type; }; template<bool> struct _nullptr_choose_as_enum { typedef nullptr_detail::nullptr_t_as_enum type; }; template<bool> struct _nullptr_choose_as_class { typedef _nullptr_t_as_class_chooser<_member_ptr_is_same_as_ptr::value>::type type; }; template<> struct _nullptr_choose_as_int<false> { typedef nullptr_detail::nullptr_t_as_void type; }; template<> struct _nullptr_choose_as_enum<false> { struct as_int { typedef nullptr_detail::nullptr_t_as_int nullptr_t_as_int; static const bool _is_convertable_to_ptr = _is_convertable_to_ptr_impl<nullptr_t_as_int>::value; static const bool _equal_void_ptr = _is_equal_size_to_void_ptr<nullptr_t_as_int>::value; }; typedef _nullptr_choose_as_int<as_int::_is_convertable_to_ptr == bool(true) && as_int::_equal_void_ptr == bool(true)>::type type; }; template<> struct _nullptr_choose_as_class<false> { struct as_enum { typedef nullptr_detail::nullptr_t_as_enum nullptr_t_as_enum; static const bool _is_convertable_to_ptr = _is_convertable_to_ptr_impl<nullptr_t_as_enum>::value; static const bool _equal_void_ptr = _is_equal_size_to_void_ptr<nullptr_t_as_enum>::value; static const bool _can_be_ct_constant = true;
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ
nullptr_t рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореБрдЭреЗ рдПрдХ
рд╕реНрд╡рддрдВрддреНрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдирд╣реАрдВ рдорд┐рд▓реА рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рд╡реИрд╕реЗ, рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ), рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрд╢рд╛
рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛
рд╣реИ (
_can_be_ct_constant рд╣рдореЗрд╢рд╛
рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ )ред рдЕрдЧрд▓рд╛, рд╣рдо
рдПрдирдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ (рдХрдВрдкрд╛рдЗрд▓рд░
рдПрдирдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реВрдЪрдХ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдХрд╛рд░ рдХрд┐рд╕реА рддрд░рд╣ рдЧрд▓рдд рд╣реИ), рддреЛ рд╣рдо рдЗрд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ (рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕реВрдЪрдХ рдХреЗ
рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЦреИрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо
рд╢реВрдиреНрдп * рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
nullptr_t рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ SFINAE рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╢рдХреНрддрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рдХ-рдирд┐рд░реНрднрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП (рдмрдврд╝рд╛рд╡рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдм
#ifdef #else # рдЪреЗрдХ рдХреЗ рд╕рд╛рде
crammed рд╣реЛрдЧрд╛ред
рдПрдВрдбрд┐рдл )ред
рдпрд╣ рдХреЗрд╡рд▓
рдирд╛рдорд╕реНрдерд╛рди stdex рдореЗрдВ
nullptr_t рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛
рд░рд╣рддрд╛ рд╣реИ (
nullptr рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рддрд╛рдХрд┐ рдПрдХ рдЕрдиреНрдп рдорд╛рдирдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛
рд╕рдХреЗ рдХрд┐
nullptr рдкрддрд╛ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде
nullptr рдХреЛ рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ)ред
namespace stdex { typedef detail::_nullptr_chooser::type nullptr_t; } #define nullptr (stdex::nullptr_t)(STDEX_NULL)
рддреАрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рдХрд╛ рдЕрдВрддред
рдЪреМрдереЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рдореИрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЯрд╛рдЗрдк_рдЯрд╛рдЗрдЯреНрд╕ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рдХреЛрдВ рдореЗрдВ рдХреМрди рд╕реЗ рдХреАрдбрд╝реЗ рдЖрдПред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред