You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指向std::variant的指针是否始终等于指向其某一备选类型的指针?

指向std::variant的指针是否等于其备选类型实例的指针?

这个假设并不始终成立,原因如下:

  • C++标准并未规定std::variant的内部内存布局,仅要求它能正确存储当前活跃的备选类型实例,并维护一个判别式(用于标识当前活跃的类型)。不同编译器或同一编译器的不同版本,完全可以自由选择判别式和存储区域的排列方式。
  • 你给出的示例中指针相等,只是因为该实现将存储备选类型的联合体放在了std::variant对象的起始地址,判别式可能被安排在其他位置(比如联合体之后)。但存在另一种合法实现:将判别式放在联合体之前,此时存储备选类型的联合体地址会比std::variant对象的地址偏移判别式的大小(通常是1、2、4或8字节),这时候两者的指针就不相等了。

因此,绝对不能依赖“指向std::variant的指针等于其活跃备选类型实例的指针”这个行为,否则代码会失去可移植性,在不同环境下出现未定义行为。

内容的提问来源于stack exchange,提问作者glades

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:09:23