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

Dereferencing a temporary pointer to initialize a reference member variable

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

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;
};

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

Reference member 'large_object_ref' binds to a temporary object whose lifetime would be shorter than the lifetime of the constructed object [clang: dangling_member]

根据我的理解,ext.GetLargeObject() return 是指向 (*this).ext.large_object 地址的临时指针。编译器不应该知道构造的对象 &large_object_ref 实际上没有绑定到临时对象吗?

当初始化器是 prvalue 或当初始化器的类型 morecv-qualifiers 的引用但可以转换为它(当然除非转换是用户定义的并产生引用)。 (这种情况在对非常量的左值引用的情况下被拒绝;const U& 情况由于历史原因被接受。从一开始就有 const T&&it 意思是“你可以传递临时变量,我不会修改你传递的任何东西”,但这不是我们的意思。)

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