1

给定任何 POD 类型,是否建议执行以下操作:

any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
    new (&p[i].member) other_pod(whatever);
4

2 回答 2

1

鉴于这个问题有点主观,不,我永远不会推荐这样的代码。不管它是否是未定义的行为,它仍然很难阅读,并且需要任何未来的维护者花额外的时间(也许很重要)来了解你在做什么。

如果您需要可变类型功能,请使用boost::variantboost::any根据您的需要。

如果您只想从一个类中获取数据并将其复制/分配给另一个类,那么这就是转换构造函数和转换赋值运算符的用途。

于 2011-11-04T17:41:50.953 回答
0

通过在已经构建的对象之上进行构建,您违反了语言关于销毁的保证,因此无论该对象是否是 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 有,您必须非常小心地稍后释放数组被破坏。

于 2011-11-04T20:06:50.663 回答