【发布时间】:2014-03-03 05:05:28
【问题描述】:
免责声明
我正在尝试分配一个对象数组,这些对象既不能复制构造,也不能赋值,也没有默认构造函数。对象具有在运行时确定的参数。我知道您可以通过使用指针数组或巧妙地使用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 必须被正确地破坏。这排除了指针数组和对放置 new 的天真使用。
编辑/附录
我忘了提到移动构造函数不可用。在手头的实际情况下,X 产生一个工作线程并在初始构造对象的this 上下文中执行,任何使用移动构造函数的尝试都会破坏执行线程的状态。
【问题讨论】:
-
使用
vector和emplace_back。 -
@Fernandes 回复:编辑。我专门使用术语“C++1x”来表示 C++11 或 C++14 中的答案。请看:meta.stackexchange.com/questions/11474/…这既不是语法或拼写错误,也不是澄清(你改变了我的意思)。
-
那么请使用“C++11 或 C++14”。 “C++1x”曾用于表示“即将发布的 C++ 版本,过去称为 C++0x,但现在将在第三个千年的第二个十年发布”。这无助于清晰。
-
(a) 编辑修复了您的问题的一个明显问题。整个 C++ 社区,包括标准工作组,都使用 C++1y 来表示 C++14。它绝不意味着 C++11。 C++1x 根本不存在,但它存在的地方,由于 C++0x 的历史,它是模棱两可的。因此,在马蒂尼奥非常友好地为您解决之前,您的意图被歪曲了。 “谢谢”是合适的。 (b) 这不是您的帖子;这是一个问答数据库,而不是您的个人编程帮助台。
-
(c) 无需同意:您通过在 CC By-SA 3.0 许可下发布并阅读解释本网站如何运作的所有常见问题解答明确放弃了所有声明。希望能减轻你的一些困惑。另外,(d) 不要这么粗鲁。
标签: c++ arrays c++11 initialization c++14