指向std::variant的指针是否始终等于指向其某一备选类型的指针?
指向std::variant的指针是否等于其备选类型实例的指针?
这个假设并不始终成立,原因如下:
- C++标准并未规定
std::variant的内部内存布局,仅要求它能正确存储当前活跃的备选类型实例,并维护一个判别式(用于标识当前活跃的类型)。不同编译器或同一编译器的不同版本,完全可以自由选择判别式和存储区域的排列方式。 - 你给出的示例中指针相等,只是因为该实现将存储备选类型的联合体放在了
std::variant对象的起始地址,判别式可能被安排在其他位置(比如联合体之后)。但存在另一种合法实现:将判别式放在联合体之前,此时存储备选类型的联合体地址会比std::variant对象的地址偏移判别式的大小(通常是1、2、4或8字节),这时候两者的指针就不相等了。
因此,绝对不能依赖“指向std::variant的指针等于其活跃备选类型实例的指针”这个行为,否则代码会失去可移植性,在不同环境下出现未定义行为。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

