std::any 的支撑初始化

时间:2021-04-24 11:30:18

标签: c++ c++17

在声明类类型的 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()};

类的析构函数被调用两次导致未定义的行为。

这种行为是有意为之吗?

1 个答案:

答案 0 :(得分:2)

{
  std::any d{B()};
}

在上面的块中创建了 B 的两个实例,并销毁了两个。一个临时 B() 和一个在 any 内。

很可能您违反了 0/3/5 规则,并且没有正确的复制/移动构造函数。

std::any c(B());

c 是一个函数,而不是一个变量。这是令人烦恼的,但它是与 兼容的遗留规则;如果一个声明可以被解析为一个函数,那就是。

{
  std::any a;
  a.emplace<B>();
}

这里没有创建临时文件。一个 Bany 中创建并销毁。

{
  std::any b = std::make_any<B>();
}

同上。

您的非共享 B 类中有一个错误,它无法处理被移动然后两个副本都被销毁的问题。