我正在尝试使用 C++x0 中的 unique_ptr,方法是

#include <memory>

并与 -std=c++0x 兼容,但是它抛出了许多错误,这是一个例子。
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../include/c++/4.4.4/bits/unique_ptr.h:214: error: deleted function ‘std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = Descriptor, _Tp_Deleter = std::default_delete<Descriptor>]’

更新****
这就是我想要做的,我已经删除了 typedef,所以你可以清楚地看到类型
static std::unique_ptr<SomeType> GetSomeType()
{
    std::unique_ptr<SomeType> st("Data","Data2",false);

    std::unique_ptr<OtherType> ot("uniportantconstructor data");

    st->Add(ot);

    return st;

}

//Public method of SomeType
  void Add(std::unique_ptr<OtherType> ot)
  {
    //otmap is std::map<std::string,std::unique_ptr<OtherType> >
    //mappair is std::Pair<std::string,std::unique_ptr<OtherType> >
     otMap.Insert(mappair(ot->name(),ot));
  }

更新:

如果我的类 SomeType 有一个方法从 map 中返回一个元素(使用键)说
std::unique_ptr<OtherType> get_othertype(std::string name)
{
   return otMap.find(name);
}

这将确保调用者会收到指向映射中的指针而不是拷贝的指针?

最佳答案

std::unique_ptr<OtherType> ot("unimportant constructor data");
st->Add(ot);

您不能将左值传递给接受 unique_pointer 的函数,因为 unique_pointer 没有复制构造函数。您必须移动左值(将其转换为 xvalue)或传递纯右值:
// pass an xvalue:
std::unique_ptr<OtherType> ot("unimportant constructor data");
st->Add(std::move(ot));
// note: ot is now empty

// pass a prvalue:
st->Add(std::unique_ptr<OtherType>("unimportant constructor data"));

Add 方法内部,事情有点复杂。首先,您必须从 ot 移开,因为形式参数始终是左值(因为它们有名称)。其次,您不能从 ot 移动并获取 ot->name() 作为 mappair 函数的参数,因为在 C++ 中未指定参数求值的顺序。因此,在从 ot->name() 移动之前,我们必须在单独的语句中获取 ot :
void Add(std::unique_ptr<OtherType> ot)
{
    auto name = ot->name();
    otMap.Insert(mappair(name, std::move(ot)));
}

希望这可以帮助。请注意,在任何(正常)情况下,两个 unique_ptr 对象都不能指向同一事物。如果您需要该功能,那么 unique_ptr 不是您想要的。

关于C++x0 unique_ptr GCC 4.4.4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3763621/

10-12 20:36