为什么unique_ptr不允许const_cast?

Kap*_*pil 2 c++ casting constants unique-ptr c++11

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

  const std::unique_ptr<int> myptr;
  std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr));
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ley 5

您可以 const 强制转换 unique_ptr。您不能做的是从 const unique_ptr 移动,而这正是您的代码尝试执行的操作。不过你可以这样做:

vec.push_back(std::move(const_cast<std::unique_ptr<int>&>(myptr)));
Run Code Online (Sandbox Code Playgroud)

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

在你的新代码中

std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int> >(myptr));
Run Code Online (Sandbox Code Playgroud)

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

std::unique_ptr<int> myptr1 = std::move(const_cast<std::unique_ptr<int>& >(myptr));
//                                                                     ^
Run Code Online (Sandbox Code Playgroud)