有没有办法确保存储在类中的const引用总是引用有效对象?

时间:2014-05-13 00:56:28

标签: c++ reference temporary object-lifetime anonymous-objects

我写了以下示例代码:

#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引用总是引用一个有效的对象吗?

2 个答案:

答案 0 :(得分:2)

您可以在class A中做一件事:

A(B&&) = delete;

这样,尝试从A临时构造B的两行将无法编译。

这显然不会阻止你提供一些其他B对象的生命周期短于引用它的A对象,但它是朝着正确方向迈出的一步,可能会抓到一些偶然/粗心的滥用。 (其他答案已经讨论了设计方案和替代方案 - 我不会涵盖相同的理由/ 图示方案中的引用是否安全(r)已经是一个重要问题。)

答案 1 :(得分:1)

不,没有。请记住,引用是引擎盖下的指针,通常不控制它们引用的对象的生命周期(有关异常,请参阅here,尽管在这种情况下不适用)。我建议只有一个B对象,如果这是你需要的一段代码。

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