C++ 有没有办法确保类中存储的常量引用始终引用有效对象?
我编写了以下示例代码:C++ 有没有办法确保类中存储的常量引用始终引用有效对象?,c++,reference,temporary,object-lifetime,anonymous-objects,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)
#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;
}
因此,我从输出中得到的是,两个匿名对象在初始化完成时被销毁,即使它们是在全局上下文中声明的
由此我的问题:是否存在一种方法来确保存储在类中的常量引用始终引用有效对象?不,没有。请记住,引用是隐藏的指针,通常不控制它们引用的对象的生存期(请参阅以获取异常,尽管在本例中不适用)。如果您需要一段代码,我建议只使用B对象
此外,您还可以使用C++11中的对象,如
共享ptr
,它只会在函数和对象中的指针都被销毁后删除该对象。在类a
中可以做的一件事是:
A(B&&) = delete;
这样,试图从AB
临时构建A
的两行代码将无法编译
这显然不会阻止您提供比引用它的
a
对象寿命短的其他B
对象,但这是朝着正确方向迈出的一步,可能会导致一些意外/粗心的滥用。(其他答案已经讨论了设计方案和备选方案-我不会再讨论同样的理由/说明方案中的引用是否安全(r)已经是一个重要问题。)缓解这一问题的一种流行方法是使用智能指针。引用不必是隐藏在引擎盖下的指针;在任何情况下,这都无关紧要,因为引用和指针具有不同的语义。
A(B&&) = delete;