【发布时间】:2020-02-02 20:43:34
【问题描述】:
让 B 派生自 A 类。通过阅读各种帖子,我的印象是像 in 一样进行转换
const std::shared_ptr<const A> a(new B());
const std::shared_ptr<const B>& b = reinterpret_cast<const std::shared_ptr<const B>&>(a);
出于某种原因不鼓励使用,应该使用 reinterpret_pointer_cast 代替。但是,出于性能原因,我想避免创建新的 shared_ptr 。上面的代码合法吗?它会导致未定义的行为吗?它似乎在 gcc 和 Visual Studio 中工作。
【问题讨论】:
-
100% 未定义。
-
为什么要这样做?多态性的全部意义不在于不知道动态类型是什么吗?
-
@curiousguy 这已经是严格意义上的 UB 了吗?强制转换是未指定的行为,我认为当您使用指针时它会得到 UB,因为它违反了严格的别名规则。并不是说这种吹毛求疵真的很重要,但我很好奇。
-
@Jens 不,它是 UB,因为没有什么可以定义使用强制转换的 std 类的结果。
-
@curiousguy 只是投射不是 UB:stackoverflow.com/questions/58329972/…。还有一个对访问对象意味着什么的定义的参考。从正式的角度来看,我认为这个定义并不令人满意。
标签: c++ shared-ptr reinterpret-cast