'&' 需要 l 值 &std::unique_ptr<>.get

'&' requires l-value on &std::unique_ptr<>.get

本文关键字:ptr gt get lt std 需要 unique      更新时间:2023-10-16

我试图使用NuiCreateSensorByIndex(int, inuissensor **)函数。我尽量不使用裸指针,所以我做了std::unique_ptr<INuiSensor> nui;使它成为一个unique_ptr。现在我想访问这个函数,所以我做以下操作:hr = NuiCreateSensorByIndex(i, &nui.get());,但这是错误的:

KinectManager.cpp:29: error: C2102: '&' requires l-value

我做错了什么,如何解决它?

编译器是正确的:虽然std::unique_ptr<INuiSensor>可以用来指向东西,但它不是NuiCreateSensorByIndex(int,INuiSensor**)函数所期望的指针对象。函数想要一个指向指针的指针的原因是,它想通过这样的赋值来修改指针的内容:

*ptrToPtr = somePtr;

如果编译器允许您传递指向std::unique_ptr<INuiSensor>的指针,则此赋值将无效。这就是为什么您需要创建一个临时的"裸"指针,将其传递给函数,然后将结果赋值给std::unique_ptr<INuiSensor>

T* get() const;

get通过返回其指针,因此您所做的是获取临时(技术上称为右值)的地址,这是不允许的。

要解决这个问题,您应该将该值存储在一个变量中:
INuiSensor* ptr = uni.get();
hr = NuiCreateSensorByIndex(i, &ptr);

unique_ptr的目的是控制资源的所有权。指针指向指针是修改资源的地址,这将改变资源的所有权。一种解决方案是先释放所有权,然后回收它,例如:

auto p = uni.release();
NuiCreateSensorByIndex(0, &p);
uni.reset(p);