为什么不在语言中内置`new`和`delete`而不仅仅是常规函数呢?

为什么非放置的newexpression式和deleteexpression式实现为内置的语言而不是常规函数?

如果我们有…

  • 一种向OS请求/回馈内存的方式

  • 一种显式调用构造函数的方法(放置new

  • 一种显式调用析构函数的方法~T()

…为什么不能不放置newdelete只是在标准库中的常规function? 例:

 template <typename T, typename... Ts> T* library_new(Ts&&... xs) { auto* ptr = /* request enough memory for `T` from OS */; new (ptr) T(std::forward<Ts>(xs)...); return ptr; } template <typename T> void library_delete(T* ptr) { ptr->~T(); /* reclaim memory for `T` from OS */ } 

如果用户的目标是在某个内存位置创build一个对象,那么由于转发引用可变参数模板放置新对象不是那些日子里的事情,所以new看起来像是一种自然的方法。 正如@TC模板指出的那样,在1990年发布,并在1989年新的放置。另一方面,variables模板只在C ++ 11中成为C ++的一部分。

tl; dr 没有办法将一堆参数转发给任意types的构造函数(就像你现在可以用make函数一样)。

也许这不是最好的参考,但这是维基百科有关在C ++中放置new

在C ++的早期版本中,没有像放置新的那样的东西; 相反,开发人员在构造函数中使用显式赋值来实现类似的效果。 这种做法在后来被弃用和取消,而“C ++编程语言”第三版没有提到这种技术。 大约在1995年,编译器中增加了对运算放置的支持。

也许在2017年,可以实现new的标准库function。 您build议的实施使用最近添加的语言function(其中许多在2010年以后)。

然而,C ++语言比1983年更老,而且一开始没有可变模板,没有typename ,没有放置new ,没有转发引用。

一开始只有经常性的newfunction,因为当时没有办法把它作为一个图书馆function来实现。

如果已经将它们作为独立function提供,则不可能为它们提供用户定义的replace。

例如,现在根据标准,是legel写我自己的globl newdelete他们将在整个程序中使用。

18.6.2存储分配和释放[new.delete]

2可replace:AC ++程序可以用这些函数签名来定义函数,从而取代由C ++标准库定义的默认版本。

如果这些提供就像库函数的其余部分那么每个正常的调用newdelete将导致“多个重载函数实例匹配参数”的错误。