从constexpr成员函数访问非const数据成员是否符合C++标准
结论
该行为属于C++标准明确允许的合法用法,不是GCC、MSVC的非标准实现扩展。
规则说明
- C11标准中,
constexpr非静态成员函数默认隐含const修饰,因此此时不允许定义非const的constexpr成员函数,你的代码在C11模式下编译会直接报错。 - 从C++14开始,标准移除了
constexpr成员函数默认带const的限制,只要函数逻辑符合constexpr的要求,就可以定义非const的constexpr成员函数。
另外constexpr函数本身就同时支持两种调用场景:既可以在编译期常量上下文调用,也可以像普通函数一样在运行期调用,你的示例代码里foo.get_val()属于运行期调用,完全符合标准要求。
验证方法
你可以手动指定编译器使用C11标准编译上述代码,GCC、MSVC都会抛出编译错误,而指定C14及以上版本标准都能正常编译运行,也能印证这是标准原生支持的特性。
内容的提问来源于stack exchange,提问作者PhantomPilot
相关产品推荐
相关产品推荐

