我有一个我希望能够使用临时unique_ptr构建的类,如下所示:
MyCollection foo(std::unique_ptr<MyObj>(nullptr));
对象应该拥有指针的所有权。我的问题是,这个正确的构造函数签名是什么?
1. MyCollection(std::unique_ptr<MyObj> foo);
2. MyCollection(std::unique_ptr<MyObj>&& foo);
第一个选项没有链接。第二个是,但是如果我使用它会发生什么,然后尝试用非R值构造MyCollection?即
std::unique_ptr<MyObj> pointer(nullptr);
MyCollection(pointer);
答案在这里:How do I pass a unique_ptr argument to a constructor or a function?表示我应该按值获取unique_ptr,但正如我上面所述,它在VS2010中没有链接(错误看起来像这样......
Error 5 error LNK2028: unresolved token (0A00075A) "private: __thiscall std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >(class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > const &)" (??0?$unique_ptr@VIVDSDocCore@@U?$default_delete@VIVDSDocCore@@@std@@@std@@$$FAAE@ABV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> >::<MarshalCopy>(class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > *,class std::unique_ptr<class IVDSDocCore,struct std::default_delete<class IVDSDocCore> > *)" (?<MarshalCopy>@?$unique_ptr@VIVDSDocCore@@U?$default_delete@VIVDSDocCore@@@std@@@std@@$$FSMXPAV12@0@Z) C:\sviluppo\FerrariGes\GesDB\VDS.NET\VDS\vdsdoc.obj
有些回复表明我需要使用移动功能。如果我使用构造函数1,并尝试创建这样的对象:
如果我使用构造函数1,并尝试创建这样的对象:
MyCollection foo(move(std::unique_ptr<MyObj>(nullptr)));
我收到相同的链接错误。
答案 0 :(得分:0)
你应该接受unique_ptr by value,但由于无法复制,你必须将移动到构造函数中:
MyCollection(std::unique_ptr<MyObj> foo);
//..
std::unique_ptr<MyObj> pointer(/*something*/);
MyCollection(std::move(pointer));
编辑我的不好,我刚注意到我重写了第一次使用构造函数。
MyCollection foo(std::unique_ptr<MyObj>(nullptr));
当然,应该与构造函数一起使用unique_ptr by value。
但是,链接器错误中提到的函数签名对我来说有点奇怪,它基本上是
void __clrcall unique_ptr<X>::<MarshalCopy>(unique_ptr<X>*, unique_ptr<X>*)
所以也许这是一个完全不同的问题。我对CLR不是很坚定,所以请原谅我,如果我错了:你在C ++ / CLI中使用unique_ptr吗?这支持了吗? <MarshalCopy>
内部做了什么 - 看起来像生成的东西,也许它不适用于仅移动类型?