C++ 用两个参数调用新运算符但不赋值
我发现了这段代码,但我不明白,为什么它能在项目中工作。守则的结构如下:C++ 用两个参数调用新运算符但不赋值,c++,new-operator,C++,New Operator,我发现了这段代码,但我不明白,为什么它能在项目中工作。守则的结构如下: class MyClass { int value; }; struct MyStruct { MyClass classA; MyClass classB; }; int main() { MyStruct myStruct; new (&((&myStruct)->classA)) MyClass(); new (&((&myS
class MyClass {
int value;
};
struct MyStruct {
MyClass classA;
MyClass classB;
};
int main() {
MyStruct myStruct;
new (&((&myStruct)->classA)) MyClass();
new (&((&myStruct)->classB)) MyClass();
}
(我添加了内部符号AND以创建一个较小的示例。在源代码中,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。我希望有人能解释一下这个代码背后的主要思想以及我要修改的代码。是一种C++语言的特性,它要求在使用之前可以包含一个适当的头。
使用placement new时,表达式必须调用重载的运算符new
,作为其计算的一部分。确切地说,这种过载:
void* operator new (std::size, void*);
但是这个函数并不是在每个翻译单元中自动为您声明的。因此,要将其拉入,必须包含正确的标题(
)
作为旁注,您显示的代码非常不完整。它两次构造
myStruct
的成员!对于非琐碎的案件,这可能会造成严重破坏
非常明确地初始化myStruct
的正确方法如下:
MyStruct myStruct {
{}, // Default construct classA
{} // Default construct classB
};
查找。这个
(&myStruct)->
没有任何意义。或者至少我不希望这样做。无论是谁编写的代码都知道足够的C++是危险的,但却不够有效。我很好奇,人们会如何知道新的布局,这是一个很少使用的特性。但我对对象是如何创建的一无所知。如果我添加#include
,似乎可以编译。回答得好-旁注;甚至不需要显式初始化;默认构造函数本身将使对象保持相同的状态——在本例中是这样。@UKMonkey——这是真的。因此,我对这是一个非常显式初始化的玩笑:)