我有一个很常见的问题。我有一个类必须存储指向不同类对象的非拥有指针。
我知道:
想想例如
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
这样的容器。所以我认为没问题,但我想知道是否有任何我应该寻找的问题。
最佳答案
自 Foo
是您需要调用的结构 get()
每次访问 Foo 的任何成员或字段时。对于引用或指针,您可以使用 '.'或 '->' 分别用于成员访问。所以reference_wrapper
在这方面不是“透明的”。 (目前也没有办法在 C++ 中使它“透明”,这当然很好)。
不会有运行时开销,但代码会被 get()
堵塞。调用。
如果这不是您关心的问题,那么使用 reference_wrapper
没有任何缺点。而不是一个指针。 (实际上reference_wrapper
是通过使用指针成员实现的)
编辑:如果您只需要调用 Foo
的一两个成员函数也是如此可以从 reference_wrapper
继承并添加一个调用 stub 。但这可能有点矫枉过正……
关于c++ - 使用 `std::reference_wrapper<T>` 作为始终有效的成员变量而不是指针有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65007049/