C++ 对本地临时对象的引用

标签 c++

考虑下面的模板类

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

我收到以下警告:“正在返回对本地临时对象的引用”。

问题:

  1. 编译器是否在返回其引用之前从“&a”隐式实例化类型为“int * const”的局部临时对象?

  2. 我确实知道 A.a 确实存在,那么我可以忽略这个警告吗?使用此代码会有任何不良副作用吗?

  3. 处理这种情况的正确方法是什么?我是否需要使用成员变量 'int *a' 来代替。这会很麻烦。

最佳答案

  1. 是的。
  2. 你不能忽略这个警告。 A.a 存在,但这不是问题所在。您返回的不是指向 int 的指针,而是指向指向 int 的指针的引用,即它是一个双重间接寻址。具体来说,在 getContent 中创建了一个指向 A.a 的临时 int*。返回对该临时文件的引用,然后临时文件被销毁。使用 getContent 的结果将是未定义的行为。
  3. 处理这种情况的惯用方法通常是存储您要向其传递 const 引用的成员。换句话说,有一个成员 int* a,然后在您的函数中简单地返回 a。返回 const 引用是公开数据成员的全部功能的常用方法,而不允许类的用户对其进行修改,从而破坏类的不变量。

关于C++ 对本地临时对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33513601/

相关文章:

c++ - 解决方案中的链接失败

c++ - 在 C++ 中用 %20 替换字符串中的空格

c++ - uint64_t 错误地达到了 18,446,744,071,590,568,320

c++ - 在模板中使用模板实例类型

c++ - 如何创建 IPP(英特尔性能原语)C++ 包装函数?

c++ - 在 Qt 中更改标签

c++ - 如何使用extern在g++中编译多个文件

c++ - memcmp 为相同(零值)位字段结构返回非零

c++ - 固有滴答计数,无需外部 api 的良好性能测量

c++ - 通过 TCP 套接字接收可变大小的数据