为何不引入对应头文件时编译器无法识别placement new运算符?
问题解答
- 你遇到的问题核心是new表达式和
operator new函数的声明规则差异:
我们写的new int属于C++内置的new表达式语法,本身不需要依赖任何头文件。编译器处理普通new表达式时,会自动调用内置声明的全局operator new函数分配内存,再执行对象构造逻辑,所以不需要引入头文件就能正常编译。 - placement new(定位new)确实是C++标准规定的语言内置特性,不是第三方扩展。它的特殊之处在于,需要调用专门重载的
operator new才能工作,这个重载函数的签名为void* operator new(std::size_t, void*) throw(),它的声明没有被编译器默认内置,而是放在标准头文件<new>中。如果没有直接或间接引入<new>,编译器找不到对应重载就会报错。
你提到引入<iostream>后就能正常编译,是因为<iostream>的内部实现依赖了<new>头文件,相当于间接完成了引入,不是<iostream>本身提供了相关声明。 - Visual Studio抛出的
'operator new': no overloaded function takes 3 arguments错误,是VS默认调试模式下operator new会携带额外的调试隐含参数,当编译器找不到定位new对应的重载时,参数匹配计算会包含这些隐含参数,才会出现“需要3个参数”的提示,本质还是缺失<new>头文件的引入。
正确的实现方式是直接引入<new>头文件,不需要依赖其他头文件的间接引入:
#include <new> int main() { new int; // 正常编译 int* pmem = 0; new (pmem) int; // 引入<new>后可正常编译 }
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

