{ quoted server banner redacted, long lines wrapped. --mod }   
      
   On Saturday, July 20, 2013 11:11:28 AM UTC-4, Daniel Krügler wrote:   
      
   >   
   > > Is it ever safe to dereference a NULL pointer?   
   >   
   >   
   >   
   > There exists at least one guaranteed valid application of dereferencing   
   >   
   > a null pointer, namely by invokation of typeid with a polymorphic   
   >   
   > runtime value, e.g. in the following scenario:   
   >   
   >   
   >   
   > #include    
   >   
   > #include    
   >   
   >   
   >   
   > struct B {   
   >   
   > virtual ~B() {}   
   >   
   > };   
   >   
   >   
   >   
   > struct D : B {};   
   >   
   >   
   >   
   > void foo(B* p) {   
   >   
   > auto& type = typeid(*p);   
   >   
   > std::cout << type.name();   
   >   
   > }   
   >   
   >   
   >   
   > int main() {   
   >   
   > try {   
   >   
   > foo(0);   
   >   
   > } catch (const std::bad_typeid&) {   
   >   
   > std::cout << "Expected exception!" << std::endl;   
   >   
   > }   
   >   
   > }   
   >   
   >   
   >   
   > This is safe and valid according to [expr.typeid] p3:   
   >   
   >   
   >   
   > "When typeid is applied to a glvalue expression whose type is a   
   >   
   > polymorphic class type (10.3), the result refers to a std::type_info   
   >   
   > object representing the type of the most derived object (1.8) (that is,   
   >   
   > the dynamic type) to which the glvalue refers. If the glvalue expression   
   >   
   > is obtained by applying the unary * operator to a pointer and the   
   >   
   > pointer is a null pointer value (4.10), the typeid expression throws an   
   >   
   > exception (15.1) of a type that would match a handler of type   
   >   
   > std::bad_typeid exception (18.7.3)."   
   >   
   >   
   >   
   > > Specifically,   
   >   
   > > I'm curious about dereferencing NULL during dynamic_cast.   
   >   
   >   
   >   
   > The language does not allow this for dynamic_cast (I think this is a bit   
   >   
   > unfortunate given the very similar "polymorphic nature" of dynamic_cast   
   >   
   > and type_id).   
   >   
   >   
   >   
   > HTH & Greetings from Bremen,   
   >   
   >   
   >   
   > Daniel Krügler   
   >   
   >   
   >   
   >   
      
      
   All,   
      
   Thank you for the answers. I suspected dereferencing the NULL pointer   
   within the dynamic cast produced undefined behavior but I was hoping that   
   it did not.   
      
   Daniel,   
      
   Thanks for the info about typeid. I thought I had a vague memory of   
   hearing/reading there were exceptions about dereferencing a NULL pointer,   
   which is why I was asking this question. Agreed, I wish the standard   
   guaranteed similar behavior for dynamic_cast as it does with typeid.   
      
   I do have one follow up question. Does the typeid behavior you mention   
   apply to the pre-C++11 standard?   
      
   Regards,   
   James   
      
      
   --   
    [ See http://www.gotw.ca/resources/clcm.htm for info about ]   
    [ comp.lang.c++.moderated. First time posters: Do this! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|