C++是否有标准的添加/移除const的常用工具函数?
非const成员函数复用const版本实现的相关问题
问题1:有没有业内常用的标准库函数实现该功能?
- 给对象加const引用的需求,C++20起标准库提供了
std::as_const,和你自己写的AddConst功能完全一致,直接用就行:#include <utility> char& CallConstTest::operator[](size_t index) { return const_cast<char&>(std::as_const(*this)[index]); } - 至于移除返回值const限定的操作,标准库没有对应的封装函数。原因很简单:
const_cast是个显式的风险操作——只有你明确知道目标对象本身不是const的时候,用它才安全。标准库不会封装这种操作,就是怕开发者随便乱用搞出未定义行为。
问题2:为什么const_cast<char&>(static_cast<const CallConstTest&>(*this)[index])是正确写法?
拆成两步就能明白它的合理性和安全性:
static_cast<const CallConstTest&>(*this):
把当前非const的*this转成const引用,目的就是触发调用const版本的operator[]。这种转换绝对安全——非const对象本来就可以被当成const对象用,不会改对象本身的属性,还能复用const版本里的安全检查、边界校验等所有逻辑,完美避免代码重复。const_cast<char&>(...):
const版本的operator[]返回const char&,但我们的非const版本要返回char&。这里用const_cast是安全的,因为当前函数是非const成员函数,能进到这个函数里,说明调用它的*this本身就是非const对象,它的m_buffer元素本质上是可修改的。我们只是去掉了返回引用的const限定,没碰对象本身的const属性,不会触发未定义行为。
另外要提一句:这种「非const调用const版本」的写法,比反过来(const版本调用非const版本)安全多了。如果反过来写,得用const_cast去掉this的const限定,要是const版本被真正的const对象调用,直接就触发未定义行为了,而当前写法完全没这个隐患。
内容的提问来源于stack exchange,提问作者Natio2
相关产品推荐
相关产品推荐

