正如标题所说,如果我将指针强制转换为指向基类和派生类的指针,当指针为空时,从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
),所以动态指向的对象不是错误的类型(因为没有指向的对象)。
在这种情况下,标准是怎么说的?
发布于 2016-12-12 19:44:18
所有格式良好的指针到指针的强制转换都保证了源类型的空指针可以安全地转换为目标类型的空指针。
对于dynamic_cast
,它在
5.2.7动态转换
4如果在指针情况下v的值是空指针值,则结果是T类型的空指针值。
对于static_cast
,它在
5.2.9静态转换
11 ...将空指针值(4.10)转换为目标类型的空指针值。
所有其他强制转换都提供了类似的保证。
发布于 2016-12-12 19:45:25
static_cast
在编译时检查转换是否有效,因此强制转换指针的运行时值不起任何作用。
所以这是安全的,nullptr
会在运行时产生nullptr
。
对于任何其他类型的演员来说,这都是真的。
https://stackoverflow.com/questions/41108304
复制相似问题