以下程序是否违反严格别名规则?
#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;
}
答案 0 :(得分:5)
以下程序是否违反严格别名规则?
是的,确实如此。您使用double*
取消引用&d
(std::int64_t*
)。
违反严格别名规则的行是:
auto& n{*nptr};
在处理行时,编译器不一定知道如何设置nptr
的值。在处理该行时,它是double*
的别名这一事实并不明显。
答案 1 :(得分:5)
是的,这违反了严格的别名。您正在访问类型为double
的对象nptr
,但指针double
不是指向{{1}}的指针或与其相关的任何类型。
仅仅因为编译器没有发出警告并不意味着它不是违规行为。违反严格规定的行为是UB(因为它们是运行时行为的问题),因此不需要诊断。