Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法确保类中存储的常量引用始终引用有效对象?_C++_Reference_Temporary_Object Lifetime_Anonymous Objects - Fatal编程技术网

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;
这样,试图从A
B
临时构建
A
的两行代码将无法编译


这显然不会阻止您提供比引用它的
a
对象寿命短的其他
B
对象,但这是朝着正确方向迈出的一步,可能会导致一些意外/粗心的滥用。(其他答案已经讨论了设计方案和备选方案-我不会再讨论同样的理由/说明方案中的引用是否安全(r)已经是一个重要问题。)

缓解这一问题的一种流行方法是使用智能指针。引用不必是隐藏在引擎盖下的指针;在任何情况下,这都无关紧要,因为引用和指针具有不同的语义。
A(B&&) = delete;