1

我编写了以下示例代码:

#include <iostream>

class B
{
  int Value;

  public:
  B(int V) : Value(V) {}

  int GetValue(void) const { return Value;}
};

class A
{
  const B& b;

  public:
  A(const B &ObjectB) : b(ObjectB) {}

  int GetValue(void) { return b.GetValue();}

};


B b(5);

A a1(B(5));

A a2(b);

A a3(B(3));


int main(void)
{
  std::cout << a1.GetValue() << std::endl;
  std::cout << a2.GetValue() << std::endl;
  std::cout << a3.GetValue() << std::endl;

  return 0;
}

用 mingw-g++ 编译并在 Windows 7 上执行,我得到

6829289
5
1875385008

所以,我从输出中得到的是这两个匿名对象在初始化完成时被销毁,即使它们是在全局上下文中声明的。

从这个我的问题:是否存在一种方法来确保存储在类中的 const 引用将始终引用一个有效的对象?

4

2 回答 2

2

你可以做的一件事class A

A(B&&) = delete;

这样,试图AB临时构造一个的两行将无法编译。

这显然不会阻止您为其他B对象提供比引用它的对象更短的生命周期A,但这是朝着正确方向迈出的一步,并且可能会遇到一些意外/粗心的滥用行为。(其他答案已经讨论了设计场景和替代方案 - 我不会涵盖相同的基础/在图示场景中引用是否安全(r)已经是一个重要问题。)

于 2014-05-13T01:27:39.713 回答
1

不,那里没有。请记住,引用是引擎盖下的指针,通常不控制它们引用的对象的生命周期(请参阅此处了解例外情况,尽管在这种情况下不适用)。如果这是您需要的一段代码,我建议只使用一个 B 对象。

此外,您可以使用诸如shared_ptrC++11 中的 a 之类的对象,它只会在函数和对象中的指针都被销毁后才消除该对象。

于 2014-05-13T01:05:36.843 回答