严格的混叠违规

Strict aliasing violation

下面的程序是否违反了严格的别名规则?

#include <cstdint>

int main()
{
    double d = 0.1;

    //std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation

    //auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation

    auto nptr{reinterpret_cast<std::int64_t*>(&d)};
    auto& n{*nptr};

    ++n;
}

VS2015 没有发出警告,clang or gcc

Does the following program violate the strict aliasing rule?

是的,确实如此。您正在使用 std::int64_t*.

取消引用 double* (&d)

违反严格别名规则的行是:

auto& n{*nptr};

在处理该行时,编译器不一定知道您如何设置 nptr 的值。它是 double* 的别名这一事实在处理该行时并不明显。

是的,这违反了严格的别名。您正在访问类型 double 的对象 d,但指针 nptr 不是指向 double 或与其相关的任何类型的指针。

仅仅因为编译器没有发出警告并不意味着它不是违规行为。违反严格规则是 UB(因为它们是运行时行为的问题),因此不需要诊断。