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

带constexpr构造函数的嵌套类继承非constexpr模板参数合法吗?VC++报错存疑

关于Visual C++ 2015/2017错误C3615:这确实是编译器Bug

先看触发问题的代码:

template<typename T> struct Outer { struct Inner : T { constexpr Inner() {} } m; };
struct NonConstexpr { NonConstexpr() {} };
int main() { Outer<NonConstexpr> o; }

你观察到的现象完全正确——这段代码在GCC和Clang中可以正常编译,但在VC++ 2015、2017版本里会抛出C3615错误,提示constexpr构造函数无法生成常量表达式。

这其实是VC++旧版本的一个Bug,核心原因是它对constexpr函数的规则理解出现了偏差:

  • 根据C标准(从C11开始),constexpr函数的设计目的是支持在常量表达式上下文里调用,但如果是在普通的运行时场景调用它,完全不需要满足常量表达式的所有约束。
  • 在这个例子里,main函数创建Outer<NonConstexpr>对象是纯粹的运行时操作,根本没有要求Inner的constexpr构造函数生成常量表达式。VC++却错误地强制所有constexpr构造函数无论调用场景如何,都必须能生成常量表达式,这明显违反了标准规定。

另外,后续的Visual Studio版本(比如2019及之后)已经修复了这个问题,代码可以正常编译,这也进一步坐实了这是旧版本VC++的Bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:52:41