我写了以下示例代码:
#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引用总是引用一个有效的对象吗?
答案 0 :(得分:2)
您可以在class A
中做一件事:
A(B&&) = delete;
这样,尝试从A
临时构造B
的两行将无法编译。
这显然不会阻止你提供一些其他B
对象的生命周期短于引用它的A
对象,但它是朝着正确方向迈出的一步,可能会抓到一些偶然/粗心的滥用。 (其他答案已经讨论了设计方案和替代方案 - 我不会涵盖相同的理由/ 图示方案中的引用是否安全(r)已经是一个重要问题。)
答案 1 :(得分:1)
不,没有。请记住,引用是引擎盖下的指针,通常不控制它们引用的对象的生命周期(有关异常,请参阅here,尽管在这种情况下不适用)。我建议只有一个B对象,如果这是你需要的一段代码。
此外,您可以在C ++ 11中使用诸如shared_ptr
之类的对象,只有在函数和对象中的指针都被销毁后才会消除该对象。