正如标题所说,如果我将指针指向基类的指针,当指针为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
。
对任何其他类型的演员都如此。