愚蠢的问题,但这个假设总是成立吗?
变体(类对象)的指针 == 变体替代的指针
比较这个,在这种情况下它似乎是真的:
#include <cstdio>
#include <variant>
using val = std::variant<std::monostate, int, bool, struct some_struct>;
struct some_struct
{
void print_ptr() {
printf("pointer to contents of variant A = %p\n", this);
}
};
int main()
{
val A = some_struct{};
printf("pointer to variant A = %p\n", &A);
std::get<some_struct>(A).print_ptr();
}
产量
pointer to variant A = 0x7ffde4003818
pointer to contents of variant A = 0x7ffde4003818
但我也可以想象一个实现,其中索引变量放在 union 之前,这意味着 union 的地址将在 1/2/4/8 字节后开始。
最佳答案
标准中明确要求标准布局 union 体和结构体的地址与其第一个成员的地址相同(对于 union 体,与所有成员相同)。对于variant
,没有这样的要求。事实上,variant
布局的唯一要求是当前存在于 variant 中的 T
的存储不能在 variant
之外> 在动态内存中。
就是这样。因此,此行为完全取决于实现。它可以从标准库更改为标准库。它甚至可以根据您在 variant
中使用的 T
而改变。
不可靠。
同样不可靠的是所有备选方案都具有相同地址的假设。该标准对 variant
没有这样的要求。
关于c++ - ptr to std::variant 总是== ptr to its alternatives之一吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73111887/