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

声明constexpr对象是否会将构造函数标记为constexpr?

关于constexpr构造函数的疑问解答

首先明确:编译器不会自动将构造函数标记为constexpr,必须由程序员显式声明。

看你给出的代码:

struct S{ S() {}; };
constexpr S s{ };

这段代码无法通过编译。原因在于:constexpr变量的初始化必须依赖常量表达式,而普通构造函数(未用constexpr修饰)无法在常量表达式语境中被调用。

要让constexpr S s{ };合法,必须显式把S的默认构造函数声明为constexpr,比如:

// 方式1:显式声明constexpr空构造函数
struct S{ constexpr S() {}; };
constexpr S s{ };

// 方式2:使用=default(适用于无自定义逻辑的默认构造)
struct S{ constexpr S() = default; };
constexpr S s{ };

另外,constexpr构造函数还需要满足对应C标准的要求:比如在C11中,函数体只能是=default、=delete或者由符合常量表达式要求的语句组成;C++14及以后放宽了限制,但核心原则是构造过程必须能在编译期完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:20:58