繁体   English   中英

取消引用临时指针以初始化引用成员变量

[英]Dereferencing a temporary pointer to initialize a reference member variable

我正在使用一个可以容纳大型数据结构的外部库。 调用它返回指向它管理的对象的指针:

class ExternalLib {
public:
  int* GetLargeObject() { return &large_object; };

private:
  int large_object = 1;
};

我正在尝试为这个外部库编写一个包装器,它可以保存对我感兴趣的大型数据结构的 const 引用:

class ExternalLibraryWrapper {
public:
  ExternalLibraryWrapper() : large_object_ref(*ext.GetLargeObject()){};

private:
  ExternalLib ext;
  const uint &large_object_ref;
};

但是,我收到编译器警告:

引用成员“large_object_ref”绑定到临时 object,其生命周期将短于构造的 object [clang: dangling_member] 的生命周期

据我了解, ext.GetLargeObject()返回一个指向(*this).ext.large_object地址的临时指针。 编译器不应该知道构造的 object &large_object_ref实际上并没有绑定到临时 object 吗?

当初始化器是纯右值或初始化器的类型与引用的类型相差超过cv -qualifiers 但可以转换为它(当然,除非转换是用户定义的并且产生参考)。 (这种情况在对非 const 的左值引用的情况下被拒绝;由于历史原因,接受const U&情况。从一开始就使用const T&&表示“你可以通过临时变量,并且我不会修改你传递的任何东西”,但这不是我们所在的地方。)

显然,取消引用指针会产生一个左值,因此此警告(非常有用,因为无法使用如此初始化的引用。)表明类型不匹配与您的情况有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM