什么编译机制铸造新运算符的结果
What compilation mechanism casts the result of new operator?
显然,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
的(类型化的)值。
相关文章:
- 使用++运算符会导致意外的结果
- 三元运算符在返回语句中给出意外的结果
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 当关系运算符的含义相同时,为什么结果不同?
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- C++:比较运算符>和字符串文本的意外结果
- 为什么 == 运算符没有产生与 strcmp 相同的结果?
- 具有预分配结果C++的重载加运算符
- 使用 C++ 中的运算符重载显示不正确的结果
- 为什么当我使用额外的括号而不使用运算符重载时,插入运算符在 std::cout 中给出不同的结果?
- 为什么这个条件运算符的计算结果为 int?
- 为什么>>运算符在不同的编译器上显示不同的结果?
- 运算符的两个不同结果 - 在 c++11 中
- C++ 中的增量运算符未获得正确的结果
- 为什么在std :: string上尺寸运算符会产生意外结果
- 重载前增量运算符使用重载后增量运算符内的变量结果
- C++运算符和带枚举的计算结果为 false
- sizeof(…)运算符结果的使用令人困惑
- 根据运算符推断模板返回类型:结果
- 插入运算符结果后,垃圾出现在向量中