严格的别名规则可以吗?

时间:2016-06-23 15:50:26

标签: c++ c++11 strict-aliasing

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仅用于保存对象的地址,并且该地址仅取消引用该对象的真实类型。

所以除非它被解除引用到一个不相关的类型,否则严格的别名规则就可以了?

1 个答案:

答案 0 :(得分:5)

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

同样,允许指向同一类型的指针。因此,tstatic_cast<T*>的结果可以使用别名,因此两者都不会违反严格的别名。

相关问题