c – 没有operator =,复制构造函数或默认构造函数和运行时参数的
放弃
我正在尝试分配一个对象数组,这些对象既不是可复制的,也不是可赋值的,也没有默认的构造函数.对象具有在运行时确定的参数.我知道你可以通过使用一个指针数组或巧妙地使用placement new来解决这个问题但我更感兴趣的是,如果可以用C 11(1y)魔法干净利落的话.所以,请,这纯粹是理论上的兴趣,所以避免试图通过提供解决方案来解决“我的问题”. 代码… ……所以问题是:有没有办法在C 11或C 14中进行以下工作: class X{ public: explicit X(int a){...} X(const X&) = delete; void operator = (const X&) = delete; private: ... }; class Y{ public: Y(const std::vector<int>& args) { x = new X[]{args}; } ~Y(){ delete [] x; } private: X* x; }; 标准 具体来说,我正在寻找符合以下标准的解决方案/构造: > X不是可复制构造的. 编辑/附录 我忘了提到移动构造函数不可用.在实际情况中,X生成一个工作线程并在最初构造的对象的上下文中执行,任何使用移动构造函数的尝试都将破坏正在执行的线程的状态. 解决方法
既不可复制也不可移动,也没有默认构造函数的类不能保存在标准容器中(不符合要求)或可变大小的数组分配(只允许对固定数量的元素进行参数规范) .
这意味着您需要分配原始内存并使用placement new来构造对象.您可以将它包装在固定空间矢量类中. template <typename T> class fixed_capacity_vector { public: using size_type = std::size_t; fixed_capacity_vector(size_type capacity) : data_(::operator new(capacity * sizeof(T)),size_(),capacity_(capacity) {} fixed_capacity_vector(const fixed_capacity_vector&) = delete; fixed_capacity_vector(fixed_capacity_vector&&) = delete; fixed_capacity_vector& operator =(const fixed_capacity_vector&) = delete; fixed_capacity_vector& operator =(fixed_capacity_vector&&) = delete; ~fixed_capacity_vector() { for (size_type i = 0; i < size_; ++i) data_[i].~T(); ::operator delete(data_); } template <typename... Args> T& emplace_back(Args&&... args) { if (size_ == capacity_) throw out_of_range(); new (data_ + size_) T(std::forward<Args>(args)...); ++size_; return data_[size_-1]; } private: T* data_; size_type size_; size_type capacity_; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |