You need to enable JavaScript to run this app. 为何C++编译期获取类型名的constexpr函数会出现编译错误?
优惠活动
大模型
产品
解决方案
定价
更多

为何C++编译期获取类型名的constexpr函数会出现编译错误?

错误原因分析

  • 关于E1763 a lambda is not allowed in a constant expression错误:
    常量表达式中使用lambda是C++17才新增的语法特性,你的编译环境要么是指定了使用C14及更低的编译标准,要么是编译器版本过旧不支持C17,才会触发该错误。
  • 关于C2131 expression did not evaluate to a constant错误:
    该错误是前者的连锁报错,lambda本身不能作为常量表达式,自然无法用来初始化constexpr修饰的format变量。部分旧版本MSVC还存在对__FUNCSIG__在constexpr上下文支持不完善的问题,也会额外触发该错误。

解决方案

  1. 优先升级编译标准
    打开项目编译配置,将C标准指定为C17或更高版本。如果使用Visual Studio,操作路径为:项目属性 -> C/C++ -> 语言 -> C++ 标准,选择/std:c++17或更新的/std:c++20即可。
  2. 兼容低版本标准的修改方案
    如果无法升级到C++17,可以把代码中IIFE(立即调用lambda)的初始化逻辑替换为普通函数,或者直接放弃编译期计算特性,把format变量的constexpr修饰改为static const,修改后的初始化逻辑参考如下:
// 替换原来的lambda初始化部分
static const RawTypeNameFormat format = []{
    static_assert(GetRawTypeNameFormat(nullptr), "Unable to figure out how to generate type names on this compiler.");
    RawTypeNameFormat format;
    GetRawTypeNameFormat(&format);
    return format;
}();

也可以完全去掉lambda,改用普通函数实现初始化逻辑,兼容性更好。
3. 编译器版本升级
如果你使用的是Visual Studio 2017 15.3之前的版本,本身对C++17的支持存在大量缺失,建议升级到VS2019或更高版本的编译器,避免更多特性兼容问题。

内容的提问来源于stack exchange,提问作者JensB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 11:54:03