在声明类类型的 std::any 对象时,以下三种初始化对象的方法可以正常工作。
class B{
};
std::any a;
a.emplace<B>();
std::any b = std::make_any<B>();
std::any c(B());
但是当与花括号初始化一起使用时
std::any d{B()};
类的析构函数被调用两次导致未定义的行为。
这种行为是有意为之吗?
答案 0 :(得分:2)
{
std::any d{B()};
}
在上面的块中创建了 B
的两个实例,并销毁了两个。一个临时 B()
和一个在 any
内。
很可能您违反了 0/3/5 规则,并且没有正确的复制/移动构造函数。
std::any c(B());
c
是一个函数,而不是一个变量。这是令人烦恼的,但它是与 c 兼容的遗留规则;如果一个声明可以被解析为一个函数,那就是。
{
std::any a;
a.emplace<B>();
}
这里没有创建临时文件。一个 B
在 any
中创建并销毁。
{
std::any b = std::make_any<B>();
}
同上。
您的非共享 B
类中有一个错误,它无法处理被移动然后两个副本都被销毁的问题。