将"this"指针强制转换为另一种类型不违反严格锯齿?
Casting the "this" pointer to another type does not violate strict aliasing?
所以如果我做这样的事情:
#include <ios>
using std::forward;
template<class T>
struct pod_version final{
private:
alignas(T) uint8_t m_data[sizeof(T)];
public:
pod_version()=default;
pod_version(const pod_version&)=default;
pod_version(pod_version&&)=default;
~pod_version()=default;
pod_version& operator=(const pod_version&)=default;
pod_version& operator=(pod_version&&)=default;
template<class...V>void construct(V&&...v){
new (m_data) T(forward<V>(v)...);
}
void destroy(){
reinterpret_cast<T*>(m_data)->~T(); // g++: warning typed punned blah im allowed to break ur code LOL
reinterpret_cast<T*>(this)->~T(); // g++: :D
}
};
int main(){
pod_version<int> x;
x.construct(5);
x.destroy();
return 0;
}
注意:"m_data"和"this"应该指向同一个地方...
海湾合作委员会 4.8.1
使用 char
,而不是 uint8_t
。
类型双关规则有一个特殊情况,分别是char
、signed char
和unsigned char
,并且只有这些类型。 uint8_t
不需要指其中之一。
请注意,这个pod_version
类的整个概念是可疑的。 您正在对无效的类型强制使用简单的复制语义。 代码将尝试在未初始化的内存或对象的二进制图像上调用析构函数。 两者都会导致未定义的行为。
您的编译器正确抱怨m_data
的强制转换,因为m_data
不是char*
类型而是int8_t*
类型。严格的混叠规则不允许类型双关语,除了char*
、unsigned char*
或signed char*
之外的任何内容。
,编译器无法弄清楚通过将pod_version<T>*
转换为T*
可能暗示某些邪恶的东西。毕竟,这些都是复杂的类型,编译器不知道您将访问T
的哪些成员,它可能是int8_t
成员,在这种情况下,强制转换将完全没问题。毕竟,仅当您访问与不同基本类型的相同内存位置时,才会调用未定义的行为,而不是在更改指针类型时调用。
在任何情况下,您都通过编写强制转换来明确地告诉编译器"我知道我在做什么",因此任何健全性检查都是完全可选的。
标准不需要警告。实现可能会出于他们认为合适的任何原因警告您,或者根本不警告您。
值得一提的是,gcc 4.8.2 使用 编辑:不,它没有。-Wall
静默编译您的代码。
相关文章:
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- void* 数组将元素转换为另一种类型
- 在C++中使用另一种语言
- 将 X 坐标从一种分辨率转换为另一种分辨率
- 在 c++ 中将一种结构类型分配给另一种类型
- 如何在一种方法中创建对象并在另一种方法中使用它
- 常量静态成员函数:有另一种方法可用吗?
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 如何将程序从主发送到另一种方法
- 如何使用shared_ptr或推荐另一种方法(unique_ptr)
- 存储多种颜色并从一种颜色切换到另一种颜色
- 如何测试指针类型是否可以安全地转换为另一种指针类型?
- 将指向结构的指针转换为具有较少字段数的另一种结构类型
- 在比较中使用已强制转换为另一种类型的函数指针是否定义良好?
- 将"this"指针强制转换为另一种类型不违反严格锯齿?
- 将指针从一种基类型转换为另一种基型