【发布时间】:2020-03-06 00:07:10
【问题描述】:
class A;
class B;
//we have void *p pointing to enough free memory initially
std::pair<A,B> *pp=static_cast<std::pair<A,B> *>(p);
new (&pp->first) A(/*...*/);
new (&pp->second) B(/*...*/);
上面的代码执行后,*pp 是否保证处于有效状态?我知道答案对于我测试过的每个编译器都是正确的,但问题是根据标准这是否合法,因此。此外,如果A 或B 在C++98/03 中不可移动,是否还有其他方法可以获得这样的pair? (感谢@StoryTeller-UnslanderMonica,std::pair 自 C++11 起就有一个分段构造函数)
【问题讨论】:
-
嗯。分段放置新。我敢打赌它没有指定;这东西通常是。但我对你的问题是……为什么???为什么你认为你需要这样做?如果你必须问一个构造是否合法,你不应该使用它,因为如果没有其他的话就不清楚(但还有很多其他的)
-
我假设
A和B是完整类型,对吧? -
嗯,
std::pair有一个构造函数可以做到这一点(分段构造)。所以是的,为什么? -
@Chipster 是的,它们是完整的类型
-
@StoryTeller-UnslanderMonica 不是完全这个;该对本身正在由上述相同的构造函数正确构造。在 OP 的示例中并非如此。从对象模型的角度来看,父对象仍然不存在。就是这个问题。
标签: c++ struct language-lawyer c++98 placement-new