使用“ static_cast”在空指针(单个或多个继承)上进行降低



正如标题所说,如果我将指针指向基类的指针,当指针为null时,从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); }
};

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

标准在这种情况下怎么说?

所有形式良好的指针到点铸件保证,源类型的空指针安全地转换为目标类型的null指针。

对于dynamic_cast,它在

中说明

5.2.7动态铸造

4 如果V的值是指针案例中的空指针值,则结果是类型t。

的零指针值

对于static_cast,它在

中说明

5.2.9静态铸造

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

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

static_cast检查转换在编译时是否有效,因此铸造指针的运行时值不起作用。

因此,这很安全,nullptr将在运行时产生nullptr

对任何其他类型的演员都如此。

最新更新