Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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 unique_ptr,然后尝试从中删除std::move会产生与尝试访问复制构造函数相同的错误_C++_C++11_Copy Constructor_Smart Pointers_Move Semantics - Fatal编程技术网

C++ 创建一个const unique_ptr,然后尝试从中删除std::move会产生与尝试访问复制构造函数相同的错误

C++ 创建一个const unique_ptr,然后尝试从中删除std::move会产生与尝试访问复制构造函数相同的错误,c++,c++11,copy-constructor,smart-pointers,move-semantics,C++,C++11,Copy Constructor,Smart Pointers,Move Semantics,我注意到,当我们试图复制一个唯一的\u ptr(例如,将一个唯一指针分配给另一个)时,出现了错误 错误C2280 std::unique_ptr是 在查找过程中调用的唯一可能的候选对象是复制构造函数,因为编译器试图执行复制初始化…然后发现这是不可能的,因为所述构造函数已被删除。这是一个多步骤的过程 你可以称之为C++怪癖,也许,因为诊断是一个抽象的漏洞。但从技术角度来看,这是有意义的。因为a是const-move构造函数,所以它不是有效的候选构造函数。这正是unique\u-ptr优于auto\

我注意到,当我们试图复制一个
唯一的\u ptr
(例如,将一个唯一指针分配给另一个)时,出现了错误

错误C2280 std::unique_ptr是

在查找过程中调用的唯一可能的候选对象是复制构造函数,因为编译器试图执行复制初始化…然后发现这是不可能的,因为所述构造函数已被删除。这是一个多步骤的过程


<>你可以称之为C++怪癖,也许,因为诊断是一个抽象的漏洞。但从技术角度来看,这是有意义的。

因为
a
是const-move构造函数,所以它不是有效的候选构造函数。这正是
unique\u-ptr
优于
auto\u-ptr
的原因:-)
auto_ptr
会在这里编译,并默默地更改常量值。@Sopel,抱歉,没有按照您所写的进行操作。你可能已经明白了
unique\u ptr&
不能绑定到
const
,但是
const unique\u ptr&
可以。@curiousguy:我的错误。我正在使用一个可变的
T*
成员从早期的
auto_ptr
spec重新读取内存。这是在C++98之前纠正的。谢谢你的更正。我应该在发布之前用代码检查我的评论。还有其他一些用例,
unique\u ptr
在编译时捕获问题,
auto\u ptr
允许它们成为运行时错误,但这不是其中之一。我是罪过。可能不会伤害它有一个
unique\u ptr(unique\u ptr const&&)=delete构造函数。@Lightness在轨道上比赛。你所说的查找期间是什么意思?它是否尝试std::move,意识到它无法移动const std::unique\u ptr,因为没有定义了const std::unique\u ptr&&的move构造函数。所以它然后尝试复制,然后意识到没有复制构造函数?@Prof:“它是否尝试std::move”我不确定你的意思。您不能“尝试
std::move
”<代码>标准::移动
只是对右值的转换。首先,编译器查找采用右值引用的非
const
构造函数,但找不到,因此它开始查找复制构造函数。它找到一个并“想要”使用它,但后来发现它已被删除。“没有复制构造函数”有一个复制构造函数,但它已被“删除”。这里有一个微妙的区别,这是关键。它能找到一个它想要使用的吗?那意味着我存在于某个时刻?您稍后会发现它已被删除。编译器是否添加并删除了构造函数,或者它根本就不存在。向我的朋友道歉confusion@Prof:“删除”在这里的意思非常具体。它不会使构造函数不存在。它只是把它划掉,这样你就不能用了。