STL容器为什么要定义const和非const版本的访问器?
定义const T& at(unsigned int i) const
和T& at(unsigned int)
而不仅仅是非const版本有什么优势?
因为您无法在一个const
向量对象上调用at
。
如果您仅拥有非const
版本,则以下内容:
const std::vector<int> x(10);
x.at(0);
没有使用const
版本将无法编译。有了const
版本,这是可能的,同时防止您实际更改at
返回的内容-这是一种契约,因为向量是const
。
非const
版本可以在非const
对象上调用,并允许您修改返回的元素,这也是有效的,因为向量不是const
。
const std::vector<int> x(10);
std::vector<int> y(10);
int z = x.at(0); //calls const version - is valid
x.at(0) = 10; //calls const version, returns const reference, invalid
z = y.at(0); //calls non-const version - is valid
y.at(0) = 10; //calls non-const version, returns non-const reference
//is valid