声明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
相关产品推荐
相关产品推荐

