为什么允许new运算符返回*void到每个指针类型?

Pet*_*ter 9 c++

在C++中,不允许在没有显式强制转换的情况下为任何整数指针分配void*指针.这需要使用static_cast.

但这是怎么回事:

int* iptr = new int;
Run Code Online (Sandbox Code Playgroud)

我知道新的运算符定义如下:

void* operator new(size_t);
Run Code Online (Sandbox Code Playgroud)

C++如何处理这个问题?我知道这是一个基本问题,但很重要.我也知道低级代码必须使用void.但这项任务如何合法?iptr是指向int的指针,new返回指向void的指针,它应该触发"错误:从'void*'到'int*'[-fpermissive]"无效转换的消息.

n. *_* m. 21

您已经混淆了运算符和运算符新函数.没问题,每个人都这样.它们几乎相同,只是它们不同.

该函数void* operator new(size_t)从其生长的任何树中获取一块原始的无类型内存,并将其返回给程序.

void* raw_memory = ::operator new(42);
Run Code Online (Sandbox Code Playgroud)

这是一个普通的函数,有点奇怪的名字.

新的运营商不是一个功能,而不是一个函数调用.它是一个单独的语言结构.它需要原始内存(通常是void* operator new(size_t)函数返回的内存)并通过调用构造函数将其转换为对象.然后它返回一个正确类型的指针指向新创建的对象.

Fish* f = new Fish;
Run Code Online (Sandbox Code Playgroud)

更新自然地,还有删除操作符(与操作符相反)和void operator delete(void*)函数(与void* operator new(size_t)函数相反).

还有new []运算符,delete []运算符,void* operator new[](size_t)函数和void operator delete[](void*)函数; 它们处理对象数组(而不是单个对象).

还有一些所谓的"放置新"表单不会调用任何operator new新鲜内存的函数,而是需要一个指向原始内存的显式指针.它们没有相应的内置"删除"表单.如果你这么倾向,你可以自己动手,但我在清醒时拒绝谈论任何这些.