使用`static_cast`进行向下转换空指针(单个或多个继承)

Per*_*-lk 0 c++ polymorphism pointers downcast

正如标题所说,如果我将指向基类的指针转换为派生类,当指针为空时,从C++ 11/C++ 14标准的角度来看,这是一个安全的操作吗?

struct base
{
   virtual ~base() = default;
};

struct derived : base {};

struct wrapper
{
   using allowed_derived_t = derived;
   base* base_ptr = nullptr;

   void set_ptr(base* ptr)
   {
       if (!dynamic_cast<allowed_derived_t*>(ptr))
          throw std::logic_error("Check your user code");

      base_ptr = ptr;
   }

   allowed_derived_t* ptr() const
   { return static_cast<allowed_derived_t*>(base_ptr); }
};
Run Code Online (Sandbox Code Playgroud)

ptr()如果我在打电话之前打电话给它是安全的方法set_ptr吗?因为,在设置指针之前,base_ptr它不是必需的类型(allowed_derived_t),但是,动态指向对象不是错误的类型(因为没有指向对象).

标准在那种情况下说了什么?

AnT*_*AnT 6

所有格式良好的指针到指针转换都保证源类型的空指针安全地转换为目标类型的空指针.

因为dynamic_cast它在

5.2.7动态演员

4如果v的值是指针大小写中的空指针值,则结果为类型T的空指针值.

因为static_cast它在

5.2.9静态铸造

11 [...]空指针值(4.10)被转换为目标类型的空指针值.

所有其他演员都提供类似的保证.