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

unique_ptr inside a variant. Is it safe to use?

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

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;

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

As with unions, if a variant holds a value of some object type T, the object representation of T is allocated directly within the object representation of the variant itself. Variant is not allowed to allocate additional (dynamic) memory.

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

As with unions, if a variant holds a value of some object type T, the object representation of T is allocated directly within the object representation of the variant itself. Variant is not allowed to allocate additional (dynamic) memory.

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

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

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