实现类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,提问作者余国良
相关产品推荐
相关产品推荐

