是否需为自定义类提供const与非const版本函数?constexpr能否替代?
关于Collection类const/非const成员函数的疑问解答
1. 必须同时提供const和非const版本
答案是肯定的,这是C++ const正确性的基本要求:
- 当你手里是一个
const Collection<Type>对象时,编译器只允许调用它的const成员函数。如果只写非const版本,const对象调用size()或operator[]会直接编译失败,完全限制了类在const场景下的使用。 - 再说
operator[]:非const版本应该返回Type&(你原代码返回Type是错误的,这样没法修改元素),用来允许修改集合里的元素;const版本返回const Type&,保证const对象的元素不会被意外修改,同时避免不必要的拷贝。
2. 单个constexpr函数替代不了
绝对不行,这俩根本不是一回事:
- constexpr是用来让函数能在编译期计算结果的特性,和“成员函数是否修改对象状态”完全不搭边。const成员函数的核心语义是承诺不修改对象的内部状态,这是constexpr覆盖不了的。
- 何况你的成员函数都是虚函数,C20之前虚函数不能是constexpr,就算C20允许了,也解决不了const/非const的语义区分问题——你总不能让同一个函数既允许修改对象,又保证不修改对象吧?
修正后的示例代码
template <typename Type> class Collection { public: virtual ~Collection() = default; // 非const版本:供可修改的对象调用 virtual size_t size() noexcept = 0; virtual Type& operator[](size_t index) noexcept = 0; // const版本:供const对象调用,保证不修改内部状态 virtual size_t size() const noexcept = 0; virtual const Type& operator[](size_t index) const noexcept = 0; };
内容的提问来源于stack exchange,提问作者no one special
相关产品推荐
相关产品推荐

