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
)是安全的。所有的析构函数都在需要调用的时候被正确调用。
我想问一下,这样的变种安全吗?
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
)是安全的。所有的析构函数都在需要调用的时候被正确调用。