c++ - 使用 `std::reference_wrapper<T>` 作为始终有效的成员变量而不是指针有什么缺点吗?

标签 c++ c++11

我有一个很常见的问题。我有一个类必须存储指向不同类对象的非拥有指针。
我知道:

  • 引用对象的生命周期保证比实例的生命周期长。
  • 被引用的对象在构造函数中传递,除了移动或赋值外不会改变。
  • 它永远不会无效。
  • 它用于许多方法。
  • 它可以被许多实例共享。

  • 想想例如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/

    相关文章:

    c# - 使用 WinAPI 的窗口截图

    c++ - 无法将 std::array 转换为 int?

    c++ - 返回+重置成员变量的最有效方法?

    C++ 模板部分特化 - 最特化的是 unique_ptr<t>

    c++ - 用于生成 C++ 代码大纲/ map 的工具 - 有这样的东西吗?

    c++ - std::cout 导致内存泄漏

    c++ - VS2017从15.4.1升级到15.5.1导致构建错误

    c++ - 在 Visual Studio 2013 中添加现有 (GitHub) C++ 项目(无解决方案文件)

    c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

    c++ - 为什么我可以在私有(private)类型上使用 auto?