正如标题所说,如果我将一个指向基类的指针转换为派生类,当指针为空时,从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); }
};
如果我在调用ptr()
之前调用它,那么set_ptr
方法是否安全?因为,在设置指针之前,base_ptr
不是所需类型(allowed_derived_t
),但是,动态指向对象不是错误的类型(因为没有指向的)对象)。
标准在那种情况下说了什么?
答案 0 :(得分:6)
所有结构良好的指针到指针的转换都保证源类型的空指针安全地转换为目标类型的空指针。
对于dynamic_cast
,请在
5.2.7动态广告
4 如果v的值是指针大小写中的空指针值,则结果是类型为T的空指针值。
对于static_cast
,请在
5.2.9静态投射
11 [...]空指针值(4.10)将转换为目标类型的空指针值。
所有其他演员都提供类似的保证。
答案 1 :(得分:1)
static_cast
检查转换在编译时是否有效,因此转换指针的运行时值不起任何作用。
这样安全,nullptr
会在运行时产生nullptr
。
对于任何其他类型的演员来说都是如此。