2

我有一个类,我希望能够用一个临时的 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 会发生什么?IE

std::unique_ptr<MyObj> pointer(nullptr);
MyCollection(pointer);

答案在这里:如何将 unique_ptr 参数传递给构造函数或函数?建议我应该按值获取 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)));

我得到相同的链接错误。

4

1 回答 1

0

你是对的,你应该按值接受 unique_ptr,但由于它不能被复制,你必须它移动到构造函数中:

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 。

但是,链接器错误中提到的函数签名对我来说有点奇怪,它基本上是

void __clrcall unique_ptr<X>::<MarshalCopy>(unique_ptr<X>*, unique_ptr<X>*)

所以也许这是一个完全不同的问题。我对 CLR 不是很坚定,如果我错了,请原谅我:你在 C++/CLI 中使用 unique_ptr 吗?支持吗?内部做什么<MarshalCopy>- 看起来像是生成的东西,也许它不适用于仅移动类型?

这可能是相关的:Linker error when using unique_ptr in C++/CLI

于 2013-02-28T15:31:51.293 回答