c++ 无法将替换函数“operator new”声明为“inline”[-Werror,-Winline-new-delete]

k10s72fa  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(98)

我在使用clang时遇到了这个错误。为什么operator new不能声明为inline?

./test.h:198:1: error: replacement function 'operator new' cannot be declared 'inline' [-Werror,-Winline-new-delete]
__forceinline void *operator new(size_t size) { return malloc(size); }
^
./test.h:18:23: note: expanded from macro '__forceinline'
#define __forceinline inline __attribute__((__always_inline__))

                  ^
np8igboo

np8igboo1#

在整个程序中所有分配函数的使用都必须兼容。在一个转换单元中分配了operator new的东西必须在另一个TU中与operator delete解除分配。因此,程序必须在任何地方都有相同的实现,并且分配函数的替换不是TU局部事务,而是全局选择。
因此,不是要求每个TU包括相同的代码(这将破坏无声的、非侵入性的替换的目的,并且其违反将非常难以诊断),而是要求函数具有外部链接并且不是内联的。
将分配函数视为程序全局状态的一部分。

iyfjxgzm

iyfjxgzm2#

由于该缺陷报告,不允许:
https://cplusplus.github.io/LWG/issue404
原因是:
现有实现不允许内联函数作为替换存储器分配函数。在一些情况下,提供该功能将是困难的,并且被认为具有有限的价值。
因此,基本上原始标准没有做出任何偏好,结果实现由于实现困难而选择不允许它,因此标准效仿并禁止它。

相关问题