变体中的 unique_ptr。使用安全吗?

Jua*_*nto 4 c++ variant unique-ptr

我想问一下,这样的变体安全吗?

struct A
{
    unique_ptr<T> anything;
};
struct B
{
    int x = 0;
    int y = 0;
};
variant<A, B> myVar;

myVar = ... A object;
myVar = ... B object;
myVar = ... another A object;
Run Code Online (Sandbox Code Playgroud)

std::unique_ptr所有编译器都会调用析构函数吗?这个想法是创建一个std::arrayofvariant<A, B>以在 FIFO 中使用它。它在 Visual Studio 中似乎工作正常,但我问这个问题是因为我从cppreference.com/variant读到了这篇文章,并且我不确定我是否完全理解它:

与联合一样,如果变体保存某个对象类型 T 的值,则 T 的对象表示形式将直接在变体本身的对象表示形式中分配。不允许 Variant 分配额外的(动态)内存。

Rai*_*dex 5

您所引用的段落是标准的保证;

与联合一样,如果变体保存某个对象类型 T 的值,则 T 的对象表示形式将直接在变体本身的对象表示形式中分配。不允许 Variant 分配额外的(动态)内存。

这意味着std::variant不允许对变体持有的对象使用动态分配这是标准的保证。

如果您有一个带有 的变体对象FooFoo则位于该变体的内存中,而不是在其他地方的动态分配对象中。

unique_ptr这意味着在变体中使用动态分配(即)是安全的。所有析构函数在需要调用时都会被正确调用。