给定任何 POD 类型,是否建议执行以下操作:
any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
给定任何 POD 类型,是否建议执行以下操作:
any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
鉴于这个问题有点主观,不,我永远不会推荐这样的代码。不管它是否是未定义的行为,它仍然很难阅读,并且需要任何未来的维护者花额外的时间(也许很重要)来了解你在做什么。
如果您需要可变类型功能,请使用boost::variant
或boost::any
根据您的需要。
如果您只想从一个类中获取数据并将其复制/分配给另一个类,那么这就是转换构造函数和转换赋值运算符的用途。
通过在已经构建的对象之上进行构建,您违反了语言关于销毁的保证,因此无论该对象是否是 POD,我都不会这样做。
我想知道您是否想问一些稍微不同的问题:
any_pod* p = reinterpret_cast<any_pod*>(malloc(n * sizeof(any_pod[n]));
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
在这种情况下,你不是在重构,你只是在一块原始内存中构建。在这种情况下,放置 new 是合适的。(尽管您必须编写这样的代码非常罕见。这是您在实现 std::vector 之类的东西时可能会做的事情。)一旦最后一个 pod 有,您必须非常小心地稍后释放数组被破坏。