ptr对std::variant总是==ptr对其替代方案之一吗



这个问题很愚蠢,但这个假设总是成立吗?

ptr到变体(类对象(==ptr到可选

比较一下,在这种情况下似乎是真的:

#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 = %pn", this);
}
};
int main()
{
val A = some_struct{};
printf("pointer to variant A = %pn", &A);
std::get<some_struct>(A).print_ptr();
}

产生

pointer to variant A = 0x7ffde4003818
pointer to contents of variant A = 0x7ffde4003818

但我也可以想象一个实现,其中索引变量放在并集之前,这意味着并集的地址将在1/2/4/8字节之后开始。

标准中有一个明确的要求,即标准布局联合和结构具有与其第一个成员的地址相同的地址(对于联合,与所有成员相同(。对于variants,没有这样的要求。事实上,对variant布局的唯一要求是,当前存在于变体中的T的存储不能在动态存储器的variant之外。

就是这样,这种行为完全依赖于实现。它可以从标准库更改为标准库。它甚至可以根据您在variant中使用的T而更改。

它不可靠。

同样不可靠的是,假设所有备选方案都有相同的地址。本标准未对variant提出此类要求。

最新更新