为何取operator new函数指针在C++14编译通过,C++17却失败?
问题:C++17中
operator new无法推导auto类型的原因 先看示例代码:
#include <cstdio> int main() { auto foo = operator new; void* mem = foo(1); printf("%p", mem); }
这段代码在GCC、Clang、MSVC设置为C14版本时可正常编译,但切换到C17及更高版本时编译失败,GCC给出的错误信息为:
error: unable to deduce 'auto' from 'operator new'
原本预期该代码在两个版本中行为一致,请问C++17中发生了什么变化,导致operator new的类型无法再被推导?
原因解释
在C++14及更早版本中,全局operator new虽存在多个重载,但编译器会隐式将operator new解析为核心的单一重载:void* operator new(std::size_t),因此auto可以顺利推导出对应的函数指针类型void*(*)(std::size_t)。
而C++17引入了对齐分配函数的强制重载要求,标准明确规定全局作用域必须同时提供带std::align_val_t参数的operator new重载(即void* operator new(std::size_t, std::align_val_t))。此时,operator new不再是单一可推导的实体,而是一组重载函数的名称。当使用auto推导重载函数名称时,编译器无法确定要指向哪个具体重载,因此推导失败。
直白来说:C17之前operator new能被默认解析为单一重载,C17后它是多重载集合,auto没法从一堆重载里选出具体类型。
内容的提问来源于stack exchange,提问作者Vince Szabo
相关产品推荐
相关产品推荐

