Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么const_cast不允许用于unique_ptr?_C++_C++11_Casting_Constants_Unique Ptr - Fatal编程技术网

C++ 为什么const_cast不允许用于unique_ptr?

C++ 为什么const_cast不允许用于unique_ptr?,c++,c++11,casting,constants,unique-ptr,C++,C++11,Casting,Constants,Unique Ptr,我正在尝试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 cast一

我正在尝试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 cast一个unique_ptr。您不能做的是从const unique_ptr移动,这是您的代码试图做的。您可以这样做:

vec.push_back(std::move(const_cast<std::unique_ptr<int>&>(myptr)));
const cast在将结果传递给std::move之前尝试复制myptr。您需要将其强制转换为引用才能不复制它

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

您可以const cast一个唯一的\u ptr。您不能做的是从const unique_ptr移动,这是您的代码试图做的。您可以这样做:

vec.push_back(std::move(const_cast<std::unique_ptr<int>&>(myptr)));
const cast在将结果传递给std::move之前尝试复制myptr。您需要将其强制转换为引用才能不复制它

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

当然,你不能从一个const对象移动:move需要修改源代码,以便从中窃取资源。这意味着我不能拥有const std::unique_ptr的vector,对吗?我很确定你确实不能。vector的元素必须是可复制的或可移动的,而const unique_ptr两者都不是。你也不能有const int的向量。当然,你不能从const对象移动:move需要修改源,为了从中窃取资源。这意味着我不能拥有const std::unique\u ptr的向量,对吗?我很确定你确实不能。vector的元素必须是可复制的或可移动的,const unique\u ptr两者都不是。您也不能有const int的向量。@Kapil:是的。我们可以。您不能做的是复制一个唯一的\u ptr,这是您的新代码试图做的;不compile@Kapil:因为它仍在尝试复制const_cast自身中的唯一\u ptr。您需要将其强制转换为引用。@Kapil:e.std::unique\u ptr myptr1=std::moveconst\u castmyptr;新代码中的建议仍然是修改常量的未定义行为object@Kapil:是的。我们可以。您不能做的是复制一个唯一的\u ptr,这是您的新代码试图做的;不compile@Kapil:因为它仍在尝试复制const_cast自身中的唯一\u ptr。您需要将其强制转换为引用。@Kapil:e.std::unique\u ptr myptr1=std::moveconst\u castmyptr;新代码中的建议仍然是修改常量对象的未定义行为