[英]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;
}
以下程序是否违反严格别名规则?
是的,它确实。 您正在使用std::int64_t*
取消引用double*
( &d
)。
违反严格别名规则的行是:
auto& n{*nptr};
在处理行时,编译器不一定知道如何设置nptr
的值。 在处理该行时,它是double*
的别名这一事实并不明显。
是的,这违反了严格的别名。 您正在访问double
类型的对象d
,但是指针nptr
不是指向double
的指针或与之相关的任何类型。
仅仅因为编译器没有发出警告并不意味着它不是违规。 违反严格的行为是UB(因为它们是运行时行为的问题),因此不需要诊断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.