c++ - ptr to std::variant 总是== ptr to its alternatives之一吗?

标签 c++ pointers c++17 variant

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

变体(类对象)的指针 == 变体替代的指针

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

#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/

相关文章:

c++ - 在 C 中使用 *&*&p 理解复杂的指针和寻址运算符

c++ - Visual C++ 中的 'Bad Ptr' 是什么意思?

c - 尝试将指针取消引用回结构中

C++17:编译器为(静态存储持续时间)const 引用绑定(bind)创建的临时对象(和存储)是否可修改?

c++ - 从模板函数返回默认构造或无效

c++ - 使用对象无匹配函数错误将二维 vector 传递给函数

c++ - 有人可以解释这个 C++ 逗号运算符短路示例吗?

c - 动态数组类不会打印

c++ - 如何进行从 std::string_view 到 std::string 的转换

c# - 从 C# 代码调用 C++ native dll