【问题标题】:How to create a container of noncopyable elements如何创建不可复制元素的容器
【发布时间】:2010-11-29 05:51:12
【问题描述】:

有没有办法使用带有不可复制元素的 STL 容器?

类似这样的:

class noncopyable
{
    noncopyable(noncopyable&);
    const noncopyable& operator=(noncopyable&);
public:
    noncopyable(){};
};

int main()
{
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable'
}

【问题讨论】:

    标签: c++ stl containers noncopyable


    【解决方案1】:

    不,不可复制的元素不能在 C++ 容器类中。

    根据标准,23.1第3段,“这些组件中存储的对象类型必须满足CopyConstructible类型(20.1.3)的要求,以及Assignable类型的附加要求。”

    【讨论】:

    • 好点!如果他使用带有新 C++ STL 的相当新的编译器,std::unique_ptr 可能是他的一个选择。
    • 我必须通过消除对象的复杂深层复制需求来解决我的问题。我选择了这个答案,因为它直接回答了我的问题。不过另一个也不错!
    • 如果这些是要求,为什么可以将 unique_ptr 存储在向量或列表中? unique_ptr 不可复制构造。
    • 注意:当 C++11 中引入移动语义时,这成为可能。见stackoverflow.com/a/26906231
    【解决方案2】:

    一个选项是创建一个指向元素的指针列表(最好是 shared_ptr)。这不完全是您想要的,但它会完成工作。

    【讨论】:

    • +1,或多或少是唯一的选择,因为 IIRC std::list 要求元素是可复制构造的。
    • 这正是我想要避免的,我有时想调用 MyList.clear() 并且我需要调用不可复制的析构函数。
    • 是的 - 标准说:“存储在这些组件中的对象类型必须满足 CopyConstructible 类型 (20.1.3) 的要求,以及 Assignable 类型的附加要求。”
    • @Vargas - 好像shared_ptr&lt;&gt; 会做你想做的事。
    • 所有容器都要求包含的类型是可复制的。 shared_ptr 将自动进行内存管理,因此您可以调用 clear() 来满足您的需求。
    【解决方案3】:

    另一种选择是使用Boost Pointer Container library。这很像 std::auto_ptrs 的标准容器,如果可能的话:它保留其元素的独占所有权,并且不能被复制。与标准的 shared_ptrs 容器相比,它的开销也更少。

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 2017-02-07
      • 1970-01-01
      • 2022-10-14
      • 2019-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多