我在使用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__))
^
2条答案
按热度按时间np8igboo1#
在整个程序中所有分配函数的使用都必须兼容。在一个转换单元中分配了
operator new
的东西必须在另一个TU中与operator delete
解除分配。因此,程序必须在任何地方都有相同的实现,并且分配函数的替换不是TU局部事务,而是全局选择。因此,不是要求每个TU包括相同的代码(这将破坏无声的、非侵入性的替换的目的,并且其违反将非常难以诊断),而是要求函数具有外部链接并且不是内联的。
将分配函数视为程序全局状态的一部分。
iyfjxgzm2#
由于该缺陷报告,不允许:
https://cplusplus.github.io/LWG/issue404
原因是:
现有实现不允许内联函数作为替换存储器分配函数。在一些情况下,提供该功能将是困难的,并且被认为具有有限的价值。
因此,基本上原始标准没有做出任何偏好,结果实现由于实现困难而选择不允许它,因此标准效仿并禁止它。