【问题标题】:why const_cast is not allowed for unique_ptr?为什么unique_ptr不允许const_cast?
【发布时间】:2016-07-10 03:08:50
【问题描述】:

我正在尝试 const_cast unique_ptr,但它给了我错误:

  const std::unique_ptr<int> myptr;
  std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr));

所以我想了解如果 const_cast 可以与普通指针一起使用,为什么它不能与 unique_ptr 一起使用?

【问题讨论】:

  • 自然不能从 const 对象中移动:移动需要修改源,以便从中“窃取”资源。
  • 所以这意味着我不能拥有 const std::unique_ptr 的向量对吗?
  • 我很确定你确实不能。 vector 的元素必须是可复制的或可移动的,const unique_ptr 两者都不是。
  • 你也不能有const int的向量。

标签: c++ c++11 casting constants unique-ptr


【解决方案1】:

你可以 const 转换一个 unique_ptr。您不能做的是从 const unique_ptr 转移,这是您的代码尝试做的事情。你可以这样做:

vec.push_back(std::move(const_cast<std::unique_ptr<int>&>(myptr)));

当然,这是未定义的行为,因为您的 unique_ptr 实际上是 const。如果 myptr 是一个对 unique_ptr 的 const 引用,而这实际上不是 const,那么上面的方法是安全的。

在您的新代码中

std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr));

在将结果传递给std::move 之前,const cast 会尝试复制myptr。您需要将其转换为引用才能不复制它。

std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int>& >(myptr));
//                                                                     ^

【讨论】:

  • @Kapil:是的。我们可以。你不能做的是复制一个 unique_ptr,你的新代码会尝试这样做。
  • 甚至没有这个 std::unique_ptr myptr1 = std::move(const_cast<:unique_ptr> >(myptr));不编译
  • @Kapil:因为它仍在尝试复制 const_cast 本身中的 unique_ptr。您需要将其转换为参考。
  • @Kapil:即std::unique_ptr&lt;int&gt; myptr1 = std::move(const_cast&lt;std::unique_ptr&lt;int&gt;&amp;&gt;(myptr));
  • “在新代码中”的建议仍然是未定义的行为(修改 const 对象)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2017-10-27
  • 2016-01-25
  • 2012-04-22
  • 2021-04-01
相关资源
最近更新 更多