You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:58:15