![](/img/trans.png)
[英]Is the type cast from sockaddr_in* to sockaddr* a violation of "strict aliasing rule"?
[英]Strict aliasing rule violation
在提供的示例中来自isocpp.org常见问题的链接中,正在构造Fred对象,并将其放置在新的缓冲区中,该缓冲区正分配给另一个对象,即为
char memory[sizeof(Fred)]
众所周知,严格的别名规则使我们可以做相反的操作,即对于任何类型的对象,都可以在其上使用char*
点,并且可以取消引用该指针并根据需要使用它。
但是在此示例中,情况正相反。 我想念什么?
严格的别名规则没有提及必须将Fred*
强制转换为char*
。 只有char*
和Fred*
类型的变量可以指向同一对象,并可以用来访问它。
如果程序尝试通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:
对象的动态类型,
[..]
字符或无符号字符类型。
新的Placement创建一个新对象。 它不会为旧对象起别名。 执行placement-new时,旧对象(此示例中为char
数组)被认为已停止存在。
在进行新的放置之前,存储已充满char
对象。 新放置后,将有一个Fred
对象填充存储空间。
由于没有别名,因此没有严格的别名问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.