严格的别名规则可以吗?

Joh*_*mph 4 c++ strict-aliasing c++11

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);
Run Code Online (Sandbox Code Playgroud)

ptr仅用于保存对象的地址,并且该地址仅取消引用该对象的真实类型.

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

Nic*_*las 5

仅当您尝试通过指针/引用访问对象时,才会应用严格别名.您没有尝试通过a访问该对象void*,因此严格的别名规则甚至不适用(保护您的规则static_cast是允许它将指针转换为任何类型的规则void*,只要键入您将它转换回是正是它以前的类型).

同样,允许指向同一类型的指针.因此t,结果static_cast<T*>允许别名,因此两者都不违反严格的别名.