什么编译机制会转换 new 运算符的结果?

What compilation mechanism casts the result of new operator?

显然,new 运算符 returns void*。所以我想知道在调用 new A() 创建 class 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 expression, which in turn invokes operator new(后跟适当的转换),加上构造函数。

来自cppreference.com

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

Attempts to create an object of type, denoted by the type-id type ...

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

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

也不会编译。

这里没有演员。

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

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

执行完所有构造函数后,new 表达式的值就是 this 的(类型)值。