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:“删除”在这里的意思非常具体。它不会使构造函数不存在。它只是把它划掉,这样你就不能用了。