成员函数的constexpr、const引用返回及const限定是否独立无冗余?
关于constexpr与两个const特性的独立性与冗余性分析
使用命令g++ -std=gnu++17 -Werror -Wall -Wextra编译以下代码无警告:
struct Mutable { int x; }; class State { public: constexpr const Mutable &Immutable() const { return mutable_; } private: Mutable mutable_; } state_instance;
已知该函数签名中的三个特性含义分别为:
constexpr:表示成员函数可在编译期求值- 第一个
const:表示返回的引用不能用于修改所引用的对象 - 第二个
const:表示成员函数承诺不修改任何非mutable成员变量
问题:这三个特性是否相互独立?是否存在冗余?
此问题与以下Stack Overflow问题不同,后者未涉及返回引用的const性:
- 非const constexpr成员函数的使用场景?
- 非const成员函数上添加constexpr有什么用?
- 将setter函数标记为constexpr的目的是什么?
结论:三个特性完全独立,无冗余
三个特性分别承担不同的语义约束,彼此没有强制绑定关系,不存在冗余:
constexpr:编译期求值能力
该关键字的核心是赋予函数编译期计算的可能性,只要函数实现和调用场景符合编译期求值要求,就可以在编译阶段完成计算。它和另外两个const没有必然联系:- 可以存在非const的constexpr成员函数(用于在编译期修改对象内部状态);
- 也可以存在不带constexpr的const成员函数(仅能在运行期调用)。
返回值的
const(const Mutable &):返回引用的只读约束
这个const修饰的是返回的引用类型,直接限制调用者无法通过该引用修改指向的Mutable对象。它和成员函数的const、constexpr相互独立:- 非const成员函数也可以返回const引用;
- const成员函数语法上允许返回非const引用(尽管这通常违背const成员函数的设计语义);
- constexpr函数对返回值是否为const没有强制要求。
成员函数后的
const:只读成员函数承诺
这个const标记表示该成员函数不会修改类的任何非mutable成员变量,同时函数内部的this指针为const类型。它和另外两个特性独立:- const成员函数可以不标记constexpr;
- 非const成员函数也可以返回const引用;
- constexpr成员函数可以是非const的,用于编译期修改对象状态。
三者组合起来,实现的是「可在编译期调用、不会修改类内部状态、且返回只读引用」的精准语义,每个特性都有不可替代的作用。
内容的提问来源于stack exchange,提问作者avigt
相关产品推荐
相关产品推荐

