我怎样才能让这个涉及unique_ptr的代码编译?

Posted

技术标签:

【中文标题】我怎样才能让这个涉及unique_ptr的代码编译?【英文标题】:How can I get this code involving unique_ptr to compile? 【发布时间】:2010-04-21 23:55:10 【问题描述】:
#include <vector>
#include <memory>

using namespace std;

class A 
public:
    A(): i(new int) 
    A(A const& a) = delete;
    A(A &&a): i(move(a.i)) 

    unique_ptr<int> i;
;

class AGroup 
public:
    void                    AddA(A &&a)  a_.emplace_back(move(a)); 

    vector<A> a_;
;

int main() 
    AGroup ag;
    ag.AddA(A());
    return 0;

不编译...(说unique_ptr的拷贝构造函数被删除了)

我尝试将 move 替换为 forward。不确定我是否做得对,但它对我不起作用。


[~/nn/src] g++ a.cc -o a -std=c++0x
/opt/local/include/gcc44/c++/bits/unique_ptr.h: In member function 'A& A::operator=(const A&)':
a.cc:6:   instantiated from 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
/opt/local/include/gcc44/c++/bits/vector.tcc:100:   instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
a.cc:17:   instantiated from here
/opt/local/include/gcc44/c++/bits/unique_ptr.h:219: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>& std::unique_ptr<_Tp, _Tp_Deleter>::operator=(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>]'
a.cc:6: error: used here
In file included from /opt/local/include/gcc44/c++/vector:69,
                 from a.cc:1:
/opt/local/include/gcc44/c++/bits/vector.tcc: In member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, _Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]':
/opt/local/include/gcc44/c++/bits/vector.tcc:100:   instantiated from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = A, _Tp = A, _Alloc = std::allocator<A>]'
a.cc:17:   instantiated from here
/opt/local/include/gcc44/c++/bits/vector.tcc:314: note: synthesized method 'A& A::operator=(const A&)' first required here

【问题讨论】:

【参考方案1】:

您的标准库可能(还)没有定义unique_ptr&lt;T&gt;::unique_ptr(unique_ptr &amp;&amp;)。我在 4.5 中检查了我的标题,它在那里,所以也许尝试升级。

当找不到移动构造函数时,它会寻找复制构造函数并发现它被删除了。

不过,我在编译时遇到了其他错误。

编辑: 让它工作。我不明白为什么你必须 move 一个已经是右值引用的对象,但你这样做了。唯一的问题是缺少赋值运算符。

#include <vector>
#include <memory>

using namespace std;

class A 
public:
    A(): i(new int) 
    A(A const& a) = delete;
    A &operator=(A const &) = delete;
    A(A &&a): i(move(a.i)) 
    A &operator=(A &&a )  i = move(a.i); 

    unique_ptr<int> i;
;

class AGroup 
public:
    void                    AddA(A &&a)  a_.emplace_back(move(a)); 

    vector<A> a_;
;

int main() 
    AGroup ag;
    ag.AddA(A());
    return 0;

【讨论】:

哇!我非常感谢您的解决方案。这让我很沮丧。 测试了您的解决方案并且它有效。我真的希望 operator= 默认使用匹配的复制构造函数。也许有了auto concepts,他们会的? 你可能比我知道的更多;我通过成为错误消息骑师解决了这个问题。 一个命名的右值引用(如a)实际上是一个左值,这使得std::move成为必要。

以上是关于我怎样才能让这个涉及unique_ptr的代码编译?的主要内容,如果未能解决你的问题,请参考以下文章

React:我怎样才能让这个 React 组件写得更好更高效?

我怎样才能让这个重复而不被卡在无效输入上?

我怎样才能最小化这个程序的代码大小?

为啥这个 pg 查询这么慢?我怎样才能让它更快?

Roblox:我怎样才能让这个脚本正常工作?

我怎样才能让这个 Flutter Bloc 发送更新?