You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Array模板const对象可被修改问题求助

问题分析与解决

你的问题出在operator[]的实现上:当前你只写了一个const版本的operator[],但它返回的是可修改的T&引用,这就导致即使是const Array对象,也能通过这个引用修改内部数组的元素,完全违背了const对象的只读特性。

核心原因

在const成员函数中,this指针是const Array* const类型,意味着你不能修改类的成员变量(比如size_或者array_的指向),但array_是T*类型,它指向的内存区域在const成员函数中并没有被标记为只读——而你返回的T&直接允许外部修改这个区域的内容,所以const对象的约束被绕过了。

解决方案

你需要为operator[]提供两个重载版本:一个供非const对象使用(返回可修改引用),另一个供const对象使用(返回只读引用):

修改Array.tpp中的operator[]部分,替换为以下代码:

// 非const版本:供普通对象调用,允许修改元素
T& operator[](int n) {
    if (n < 0 || n >= size_)
        throw std::out_of_range("out of range");
    return array_[n];
}

// const版本:供const对象调用,仅允许读取元素
const T& operator[](int n) const {
    if (n < 0 || n >= size_)
        throw std::out_of_range("out of range");
    return array_[n];
}

效果验证

修改后,当你尝试执行abc[0] = 3;时,编译器会直接报错——因为abc是const对象,它会调用const版本的operator[],返回的const int&不允许被赋值,完美符合const对象的只读预期。

另外,你的setValue成员函数也应该考虑const对象的情况:当前它是非const成员函数,const对象无法调用它,这是合理的,因为setValue本身就是修改操作,保持现状即可。

内容的提问来源于stack exchange,提问作者Doğuş Hamdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:50:22