这段代码打破了严格的别名规则?

nty*_*sdd 5 c++ strict-aliasing

我阅读了http://blog.qt.digia.com/blog/2011/06/10/type-punning-and-strict-aliasing/,发现了这段代码.

QDataStream &QDataStream::operator>>(qint16 &i)
{
...
        register uchar *p = (uchar *)(&i);
        char b[2];
        if (dev->read(b, 2) == 2) {
            *p++ = b[1];
            *p = b[0];
...
Run Code Online (Sandbox Code Playgroud)

作者声称MSVC优化了我觉得很奇怪的任务.

MSVC真的利用严格的别名规则吗?

是不是uchar*特别允许用来做打字?

Ros*_*dge 1

这要么是编译器错误,要么是调用此方法的代码中的错误。“严格别名规则”允许i使用字符类型访问引用的对象,而不管该对象的实际类型是什么。调用此方法的代码实际上甚至不必传递对与qint16此函数兼容的对象的引用即可具有已定义的行为。