你是对的。标准库中唯一真正对指针执行delete
(或delete[]
)操作的指针类是智能指针。
std::variant
应该支持您持有任意数量的类型的一个对象,主要不是指向对象的指针。如果变体包含指针,则意味着其他一些对象拥有数据并负责删除它。
std::variant
只能容纳一种类型的也很少有用。在这种情况下,您可以将该变量声明为该类型的普通变量。
这是一个使用std::variant
能够保存两种不相关类型的对象的示例,并且破坏将按预期发生。
#include <iostream>
#include <variant>
class A {
public:
~A() { std::cout << "A destructor called\n"; }
};
class B {
public:
B() {}
B(const B&) = default;
B& operator=(const B&) = default;
~B() { std::cout << "B destructor called\n"; }
};
int main() {
std::variant<A, B> data; // now holds a default constructed A
data = B(); // deletes the A and now holds a default constructed B
std::cout << "---\n";
}
输出:
A destructor called // in "data = B()", the A must be destroyed
B destructor called // the temporary B used in "data = B()"
---
B destructor called // the B in the variant when the variant goes out of scope