取消引用临时指针以初始化引用成员变量
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 或当初始化器的类型 与more 比 cv-qualifiers 的引用但可以转换为它(当然除非转换是用户定义的并产生引用)。 (这种情况在对非常量的左值引用的情况下被拒绝;const U&
情况由于历史原因被接受。从一开始就有 const T&&
和 it 意思是“你可以传递临时变量,我不会修改你传递的任何东西”,但这不是我们的意思。)
显然取消引用 指针 会产生一个左值,因此此警告(非常有用,因为不可能使用如此初始化的引用!)表明类型不匹配适用于您的情况。
我正在使用可以容纳大型数据结构的外部库。调用它 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 或当初始化器的类型 与more 比 cv-qualifiers 的引用但可以转换为它(当然除非转换是用户定义的并产生引用)。 (这种情况在对非常量的左值引用的情况下被拒绝;const U&
情况由于历史原因被接受。从一开始就有 const T&&
和 it 意思是“你可以传递临时变量,我不会修改你传递的任何东西”,但这不是我们的意思。)
显然取消引用 指针 会产生一个左值,因此此警告(非常有用,因为不可能使用如此初始化的引用!)表明类型不匹配适用于您的情况。