我有一个类test
由于某些原因,这不是标准可构造的,也不是可分配的。然而,它是可复制构造的——可能会说它的行为有点像引用。
不幸的是,我需要这些元素的动态数组并意识到 vector<test>
不是正确的选择,因为 vector 的元素必须是标准的可构造和可分配的。幸运的是,我通过
- 使用
vector<T>::reserve
和vector<T>::push_back
而不是vector<T>::resize
直接填写条目(无标准构造) 赋值的 copy'n'swap 技巧以及
vector
的事实通常使用 Pimpl-idiom 实现(不直接分配现有的test
元素),即class base { private: std::vector<test> vect; /* ... */ public: /* ... */ base& operator= (base y) { swap(y); return *this; } void swap(base& y) { using std::swap; swap(vect, y.vect); } /* ... */ };
现在我假设我可能没有考虑到每一点,而且最重要的是,所有这些技巧都强烈依赖于实现。该标准仅保证标准可构造和可分配类型的标准行为。
下一步是什么?如何获得 test
的动态数组对象?
备注:我必须更喜欢标准 C++ 提供的内置解决方案和类。
编辑:我刚刚意识到我的技巧实际上不起作用。如果我定义一个真正*不可分配的类,我的编译器会出现很多错误。所以问题浓缩为最后一个问题:我怎样才能拥有这些 test
的动态数组?对象?
(*) 我的 test
类提供了一个赋值运算符,但这个运算符的工作方式类似于对引用的赋值。
最佳答案
编辑:以下不再是好的做法。如果您的对象支持移动,那么它可能适合一个 vector (有关详细信息,请参阅 std::vector
elements requirements,尤其是针对 C++17 的更改)。
考虑使用 Boost 的 ptr_vector ,Boost 指针容器库的一部分。请特别参阅该库的 motivation 中的优势#3 .
关于c++ - 接受非标准可构造和不可分配类型的 vector 的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913337/