这符合严格别名规则吗?

4
struct Test {
    void doAction() {}
};

// Create and save into a void*
void *ptr = new Test;

// Real use through a Test*
Test *t = static_cast<Test *>(ptr);
t->doAction();

// Delete
delete static_cast<Test *>(ptr);

ptr仅用于保存对象的地址,只有在解除引用时才能得到对象的真实类型。

因此,除非将其解除引用为不相关的类型,否则严格别名规则是可以接受的。


2
使用GCC编译并加上-fstrict-aliasing选项。 - Top Sekret
4
没问题,只要确保你将其转换为正确的类型。顺带一提,在许多涉及 C++ 代码与 C 代码交互的地方(主要是异步回调),你会发现这种操作被广泛使用。 - Arunmu
1个回答

5

严格别名仅适用于通过指针/引用访问对象时。您没有尝试通过void*访问对象,因此严格别名规则甚至不适用(保护您的规则是关于static_cast的规则,它允许将任何类型的指针转换为void *并返回,只要您将其转换回来的类型与之前的类型完全相同)。

同样,允许别名的是指向相同类型的指针。因此,tstatic_cast<T *>的结果允许别名,因此同时拥有两者不违反严格别名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接