namespace   integral   { struct   zero   { static   constexpr   int   value ( )   noexcept   {   return   0 ;   } } ; template < typename   T > const   zero *   operator & ( const   T & )   noexcept   {   return   nullptr ;   } } namespace   mem   { template < typename   T > struct   address_t   { constexpr   auto   operator -> ( this   auto &&   self )   noexcept   { return   & self ; } constexpr   void   value ( )   noexcept   =   delete ; } ; template < typename   T > constexpr   address_t < T >   address ( T * )   noexcept   {   return   { } ;   } } int   main ( )   { return   mem :: address < integral :: zero > ( nullptr ) -> value ( ) ; }