考虑下面的模板类
template <typename T>
class A {
public:
virtual T const& getContent() = 0;
};
我使用 'int*' 作为类型 'T' 派生这个类,如下所示
class A1 : public A<int*> {
private:
int a;
public:
int* const& getContent() { return &a; }
};
我收到以下警告:“正在返回对本地临时对象的引用”。
问题:
编译器是否在返回其引用之前从“&a”隐式实例化类型为“int * const”的局部临时对象?
我确实知道 A.a 确实存在,那么我可以忽略这个警告吗?使用此代码会有任何不良副作用吗?
处理这种情况的正确方法是什么?我是否需要使用成员变量 'int *a' 来代替。这会很麻烦。
最佳答案
- 是的。
- 你不能忽略这个警告。
A.a
存在,但这不是问题所在。您返回的不是指向int
的指针,而是指向指向int
的指针的引用,即它是一个双重间接寻址。具体来说,在getContent
中创建了一个指向A.a
的临时int*
。返回对该临时文件的引用,然后临时文件被销毁。使用getContent
的结果将是未定义的行为。 - 处理这种情况的惯用方法通常是存储您要向其传递 const 引用的成员。换句话说,有一个成员
int* a
,然后在您的函数中简单地返回a
。返回 const 引用是公开数据成员的全部功能的常用方法,而不允许类的用户对其进行修改,从而破坏类的不变量。
关于C++ 对本地临时对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513601/