使用智能指针理解C++类型转换

您所在的位置:网站首页 c2248错误 使用智能指针理解C++类型转换

使用智能指针理解C++类型转换

2023-04-18 18:11| 来源: 网络整理| 查看: 265

reinterpret_cast(pShDer)->Func(); // ok

未定义的行为。您正在指示编译器将shared_ptr的glvalue视为shared_ptr的glvalue。通过与引用对象的实际类型不 * 相似 *(即仅在const-限定方面不同)的类型进行成员访问会导致未定义的行为。

reinterpret_cast(pShDer)->Func(); // ok

也是未定义的行为,原因与上面相同。

((shared_ptr&)pShDer)->Func(); // ok

也是未定义的行为,因为它等效于reinterpret_cast(pShDer)->Func();。

static_cast(pShDer)->Func(); // ok

这一个是可以的。它创建了一个临时的shared_ptr对象,通过构造函数调用初始化,static_cast(pShDer)引用这个临时对象。std::shared_ptr有一个构造函数,如果D*可以隐式转换为B*,则可以从std::shared_ptr构造std::shared_ptr。这是完全安全的。shared_ptr完全支持这种用例。当最后一个shared_ptr被销毁时,它将始终在构建原始shared_ptr时使用的指针类型上调用delete。(注意,与此相反,unique_ptr通过unique_ptr示例的实际删除器类型进行删除。)

//static_cast(pShDer)->Func();

失败是因为不允许非const左值引用绑定到临时对象。因此static_cast也被指定为不允许等价转换为引用类型。我的想法是,我不会构造一个临时的shared_ptr,然后在代码行结束时销毁它,在static_cast的情况下,您正是这样做的,这是一件好事。而是我希望编译器将现有的shared_ptr视为指向base的指针。这从根本上是不允许的,而且总是会有UB。

((unique_ptr&)pUnDer)->Func(); // ok reinterpret_cast(pUnDer)->Func(); // ok reinterpret_cast(pUnDer)->Func(); // ok

所有这些都是未定义的行为,原因与shared_ptr相同。

//static_cast(pUnDer)->Func();

与shared_ptr的原因不同。

//static_cast(pUnDer)->Func();

不起作用,因为您正在尝试复制unique_ptr(通过创建临时对象)。unique_ptr是不可复制的。但是它是可移动的,所以static_cast(std::move(pUnDer))->Func();可以工作,但会导致所有权转移到临时unique_ptr示例,然后在全表达式结束时销毁该示例,并销毁托管derived对象。如果base没有virtual析构函数,那么这也会有UB。总而言之:如果你不能100%确定你理解reinterpret_cast在特定用例中的作用,不要使用它。否则你会导致UB。永远不要使用C风格的转换,因为它们有时可能会解析为reinterpret_cast(或其他转换),有时很难判断它们是否安全。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3