gpt4 book ai didi

c++ - 没有运算符=、复制构造函数或默认构造函数和运行时参数的对象的数组初始化

转载 作者:太空狗 更新时间:2023-10-29 19:48:35 26 4
gpt4 key购买 nike

免责声明

我正在尝试分配一个对象数组,这些对象既不能复制构造,也不能赋值,也没有默认构造函数。这些对象具有在运行时确定的参数。我知道您可以通过指针数组或巧妙地使用 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 必须被正确地析构。这排除了指针数组和天真地使用 placement new。

编辑/增补

我忘了提到移动构造函数不可用。在手头的实际情况下,X 产生一个工作线程并在初始构造对象的 this 的上下文中执行,任何使用移动构造函数的尝试都会破坏执行线程的状态。

最佳答案

如果您使 X 至少可移动,则可以使用 std::vector 及其 emplace_back 函数。

class X{
public:
explicit X(int){}
X(X&&) = default;
X(const X&) = delete;
void operator = (const X&) = delete;
};

int main() {
std::vector<X> xs;
xs.emplace_back(0);
xs.emplace_back(1);
xs.emplace_back(2);
xs.emplace_back(3);
}

(如果你声明了一个拷贝构造函数,即使那个声明删除了它,编译器也不会自动生成任何特殊的移动成员,所以你需要显式地请求它们)

这基本上可以归结为“具有新布局的数组”策略,但所有内容都抽象为高级概念。

如果您不能使用可移动类型,则必须实现一个类似 vector 的类,该类可以预先分配存储并且永远不会重新分配。标准库中没有类似的东西。

关于c++ - 没有运算符=、复制构造函数或默认构造函数和运行时参数的对象的数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21599749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com