这种类型转换是否安全?
vector<int*> a;
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a);
在这种情况下,静态转换显然不起作用,因为模板参数正在改变。但是通过执行此重新解释转换,我只是为实质上相同的类型添加了constness。那么这对于所有实际目的来说应该是安全的吗?
这种类型转换是否安全?
vector<int*> a;
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a);
在这种情况下,静态转换显然不起作用,因为模板参数正在改变。但是通过执行此重新解释转换,我只是为实质上相同的类型添加了constness。那么这对于所有实际目的来说应该是安全的吗?
像任何使用reinterpret_cast
将引用转换为不相关类型的操作一样,它会产生未定义的行为,因此除非您将“安全”定义为“在我的编译器上工作”,否则它不是安全的。
b
不引用与a
相同的内存(因为它具有不兼容别名的类型)。然后,优化器将发挥其技巧,您可能会发现它重新排序或省略了一些东西,如果a
和b
有效地 引用相同的内存,则不会重新排序或省略这些内容。因此,相同的布局是必要但不足以使其“工作”的条件。 - Steve Jessopreinterpret_cast
转换为引用或指针类型的结果基本上是无用的,并且除了转换回原始类型之外,不适用于任何其他操作,除非(a)目标类型对于别名实际对象的类型是合法的,或者(b)您有一些特定的保证来支持您正在进行的特定操作。当两者都不适用时,请勿通过任何类型引用对象,而不是其自身。这样做也称为“类型游戏”。 - Steve Jessop