加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 没有operator =,复制构造函数或默认构造函数和运行时参数的

发布时间:2020-12-16 10:08:59 所属栏目:百科 来源:网络整理
导读:放弃 我正在尝试分配一个对象数组,这些对象既不是可复制的,也不是可赋值的,也没有默认的构造函数.对象具有在运行时确定的参数.我知道你可以通过使用一个指针数组或巧妙地使用placement new来解决这个问题但我更感兴趣的是,如果可以用C 11(1y)魔法干净利落的
放弃

我正在尝试分配一个对象数组,这些对象既不是可复制的,也不是可赋值的,也没有默认的构造函数.对象具有在运行时确定的参数.我知道你可以通过使用一个指针数组或巧妙地使用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不可分配.
> X没有默认的无参数构造函数(构造具有预期的副作用).
> X的构造函数的参数直到运行时才知道.
> X的所有实例必须在内存中连续排列.
>当数组从其基指针中删除时(或者如果使用中间类,当中间对象被破坏时),必须正确地破坏X.这排除了指针数组和naiv?使用placement new.

编辑/附录

我忘了提到移动构造函数不可用.在实际情况中,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_;
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读