什么编译机制铸造新运算符的结果

What compilation mechanism casts the result of new operator?

本文关键字:运算符 结果 编译 机制 什么      更新时间:2023-10-16

显然,new运算符返回void*。所以我想知道在调用new A()创建类A的新实例时,什么机制允许void*转换为A*

举例说明:

// Example program
#include <iostream>
#include <string>
class A
{
public:
    A() {}    
};
void* createA()
{
    return new A();
}
int main()
{
    A* a1 = new A();
    A* a2 = createA();
    delete a1;
    delete a2;
}

A* a1 = new A()编译良好(显然)。

A* a2 = createA()没有报告错误:error: invalid conversion from 'void*' to 'A*'(显然太…)。

实际上,第一个也做了从void*A的转换。什么机制或规则允许第一次转换而拒绝第二次转换?

这可能是个愚蠢的问题。。。。如果是的话,很抱歉。

这里有一个new表达式,它依次调用operator new(后面是适当的转换)和构造函数。

来自cppreference.com:

::(optional) new (placement_params)(optional) ( type ) initializer(optional)

尝试创建类型为的对象,由类型id类型表示。。。

如果手动调用operator new,例如,它将不起作用

A* a2 = operator new(sizeof(A));

也不会编译。

此处没有强制转换。

当编译器看到new表达式时,它首先调用适当的new运算符(取决于类型和new关键字的参数)。它返回一个指向原始内存块的指针;这种指针通常被键入为CCD_ 18,因为它们不引用任何对象。

然后执行适当的构造函数(取决于构造函数参数),从基类开始。执行构造函数的第一步是默认初始化将要构造对象的原始内存。这包括初始化对象所需的任何内部元数据,例如它的vtable(如果它包括虚拟方法)。一旦完成,内存区域将包含一个新生对象,因此可以创建具有正确类型的this。然后可以执行构造函数的其余部分(可以隐式或显式地使用this)。

一旦执行了所有构造函数,new表达式的值就是this的(类型化的)值。