ptr 到 std::variant 是否总是 == ptr 到它的替代方案之一?

gla*_*des 4 c++ pointers variant c++17

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

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 = %p\n", this);
    }
};

int main()
{
    val A = some_struct{};

    printf("pointer to variant A = %p\n", &A);
    std::get<some_struct>(A).print_ptr();
}
Run Code Online (Sandbox Code Playgroud)

产量

pointer to variant A = 0x7ffde4003818
pointer to contents of variant A = 0x7ffde4003818
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 7

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

就是这样。因此,此行为完全依赖于实现。它可以从标准库更改为标准库。它甚至可以根据T您在variant.

这是不可靠的。

同样不可靠的是所有替代方案都具有相同地址的假设。该标准没有强加这样的要求variant