我发现了这段代码,我不明白,为什么它在项目中有效。代码的结构是:
class MyClass {
int value;
};
struct MyStruct {
MyClass classA;
MyClass classB;
};
int main() {
MyStruct myStruct;
new (&((&myStruct)->classA)) MyClass();
new (&((&myStruct)->classB)) MyClass();
}
(我添加了内部&符以创建一个更小的示例。在源代码中myStruct是一个指针)。
编译器说
In function int main()
error: no matching function for call to ‘operator new(sizetype, MyClass*)’
new (&((&myStruct)->classA)) MyClass();
^
note: candidates are:
note: void* operator new(long unsigned int)
note: candidate expects 1 argument, 2 provided
也许我错过了一些重要的事情。这是一个大项目,我无法复制它。我无法创建MWE。我希望有人可以向我解释这个代码背后的主要思想以及我必须改变以编译它。
答案 0 :(得分:4)
Placement new是C ++语言功能之一,需要在甚至可以尝试使用它们之前包含适当的标头。
使用placement new时,表达式必须调用operator new
的重载作为其评估的一部分。 这个重载,确切地说:
void* operator new (std::size, void*);
但是在每个翻译单元中都不会自动声明此功能。因此,要将其拉入,您必须包含正确的标题(<new>
)。
作为旁注,你展示的代码非常破碎。它构建了myStruct
两次的成员!对于非平凡的案件,这可能会造成严重破坏。
非常明确地初始化myStruct
的正确方法是这样的:
MyStruct myStruct {
{}, // Default construct classA
{} // Default construct classB
};