【发布时间】:2021-03-08 10:45:58
【问题描述】:
我遇到了一个很常见的问题。我有一个类必须存储指向不同类对象的非拥有指针。
我知道:
- 保证引用对象的生命周期比实例长。
- 引用的对象在构造函数中传递,除了移动或赋值外不会发生变化。
- 它永远不会无效。
- 它用于多种方法。
- 它可以被多个实例共享。
想想例如logger 非全局类。
这些点引导我使用一个保证有效性的参考变量来解决这个问题:
struct Foo{};
struct Bar{
Bar(Foo& foo):m_foo(foo){}
Foo& m_foo;
};
最大的缺点是 Bar 不必要地几乎是不可变的 - 没有分配,没有移动。
我所做的通常是将Foo 存储为指针。这解决了大多数问题,只是不再很清楚指针始终有效。此外,它增加了一个新的小问题,它可以在任何方法中失效,这不应该发生。 (将其设为 const 与 & 具有相同的缺点)。这让我在每一种方法中都添加了assert(m_foo),以便安心。
所以,我想只存储std::reference_wrapper<Foo>。它总是有效的并且它保持Bar 可变。与简单的指针相比有什么缺点吗?
我知道任何方法仍然可以
指向例如一个局部变量,但假设这不会发生,因为可能很难获得Foo 的新有效实例。至少比简单的难=nullptr;
我知道这种方法用于std::vector 之类的容器,所以我认为这没问题,但我想知道是否有任何我应该寻找的问题。
【问题讨论】:
-
可能的缺点是某种性能或存储开销,但似乎没有:stackoverflow.com/questions/46957595/…
-
@SvenNilsson 谢谢,我错过了。