在下面的示例中,test.cpp:

#include <iostream>
using namespace std;

class Rectangle {
  public:
    int w, h;
    Rectangle() : w(7), h(0) {} // constructor definition.
    Rectangle(int x, int y) : w(x), h(y) {} // constructor definition.
};


class MyClass {
  public:
    Rectangle trec;
    MyClass() {
    }
    Rectangle getRect() {
      return trec;
    }
};

int main() {
  MyClass a = MyClass();
  cout << &a.getRect() << endl;
}

...使用gcc test.cpp -o test.exe编译时出现此错误:
test.cpp: In function ‘int main()’:
test.cpp:32:22: error: taking address of temporary [-fpermissive]
   cout << &a.getRect() << endl;

我真的不明白这里是什么临时的-a运行时会实例化cout,所以a.trec也应该实例化并有一个地址,这正是getRect()返回的内容吗? (或者是否在return上隐式创建一个副本,因为返回类型定义为Rectangle而不是Rectangle*吗?)

无论如何,我都试图检查最初这样编写的代码,并且a.trecprivate,因此getRect()是我唯一可以从我的代码中使用的东西-在这种情况下是否有机会打印a.trec的地址?

最佳答案

getRect()定义为

Rectangle getRect() {
  return trec;
}

即使trec不是临时的trec实际上也不是您要返回的内容。由于您按值返回,因此需要复制trec并将其放入返回的函数中。该副本是临时的,您无法获取它的地址。

如果将代码更改为
Rectangle& getRect() {
  return trec;
}

要么
const Rectangle& getRect() {
  return trec;
}

现在,我们引用a的成员,我们可以获取该引用的地址。

09-11 20:20