You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现类Rust dyn trait:C++标准是否规定new(ptr)T()与static_cast<T*>(ptr)相等?

关于new (ptr) T() == static_cast<T*>(ptr)的C++标准有效性确认

核心结论

C++标准明确保证该等式成立。

标准依据

根据C++标准中placement new的相关规定:

  • 使用new (ptr) T()形式的placement new时,其返回值等于传入的指针ptr经static_cast<void*>转换后的结果。若ptr本身是指向适合放置T对象的对齐且足够的内存的指针,那么static_cast<T*>(ptr)与static_cast<void*>(ptr)再转回T*的结果完全等价,因此new (ptr) T()的返回值必然等于static_cast<T*>(ptr)。

对dyn trait实现的意义

这意味着你代码中Trait<void>* operator->()的转换逻辑是符合标准的,无需担心该等式不成立的问题。

另外补充你提到的其他尝试的问题:

  • 抽象类不能作为联合体成员是C++标准的硬性规定:联合体成员不能拥有非平凡构造函数/析构函数,而包含虚函数的抽象类属于非平凡类型,因此无法作为联合体成员。
  • 编译期计算抽象类的偏移确实不可行:抽象类无法实例化,编译期无法获取其具体布局信息,但你依赖的placement new返回值与原指针的等价性是有标准直接保障的,不需要通过编译期偏移计算来验证。

内容的提问来源于stack exchange,提问作者余国良

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:40:33