什么编译机制会转换 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
(后跟适当的转换),加上构造函数。
::(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
的(类型)值。
显然,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
(后跟适当的转换),加上构造函数。
::(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
的(类型)值。