我正在学习std::variant
,我不明白为什么在这个例子中,我不想初始化ab
,我用std::monostate
来初始化,类A
被构造了一次,但是被析构了两次,这是怎么回事?
#include <iostream>
#include <variant>
struct A
{
A() { std::cout << "Constructing A\n"; }
~A() { std::cout << "Destructing A\n"; }
};
struct B
{
B() { std::cout << "Constructing B\n"; }
~B() { std::cout << "Destructing B\n"; }
};
int main()
{
std::variant<std::monostate, A, B> ab;
ab = A();
}
运行此示例将得到以下输出。
Constructing A
Destructing A
Destructing A
2条答案
按热度按时间xlpyo6sf1#
此行:
正在创建一个临时
A
对象,然后将其移动到ab
中。通过添加复制/移动构造函数和赋值运算符可以观察到这一点:
输出:
您可以使用
std::variant::emplace
来避免复制/移动。如果将上述行替换为:
输出应变为:
oalqel3c2#
我在你的代码里加了两行。
那么我们可以得到这样的结果:
我对std::variant不太熟悉,我只是希望上面的实验能让你更接近真实的的答案。:)