为什么 std::vector::at 不是 const 函数?

Why isn't std::vector::at a const function?

我正在尝试实施 std::vector 但我遇到了问题。 根据 C++ 参考,std::vector::at 就像:

      reference at (size_type n);
const_reference at (size_type n) const;

我的问题是:为什么我不使用 reference at (size_type n) const;

感谢您的帮助或批评!


更新: 谢谢!这点我很清楚。

我的错是我不知道有和没有 const 的函数也是一种重载。最初的设计是在 const 向量调用它时使用带有 const 的那个,所以它会 return 一个 const_reference。当向量不是 const 时,return 值不应该是 const_reference.

但是如果我们让这 2 个函数都是 const,那么除了 return 类型不是合法的覆盖之外,这两个函数将没有区别。所以前一个不是设计成 const 虽然它可以是 const.

谢谢!

想想 ref at (size_type n) const; 可能导致的问题。首先,你需要明白const_reference at (size_type n) const;为什么存在。在 const std::vector 中,一旦它被初始化,它或它的元素就不应该被改变(因为它毕竟是 const)。正常的 reference at (size_type n);not 用于 const 向量,因为它 returns 对元素的非 const 引用,这意味着它可以改变。这违背了 consting 你的对象的想法,这就是为什么这个特定的重载不适用于 const 向量。

这就是const_reference at (size_type n) const;的用武之地。如您所知,结束const是对编译器和程序员的承诺,这不会改变其对象或为其提供机会要更改的对象,因此它可以与 const 对象一起使用。在 const_reference at (size_type n) const; 的情况下,确实如此:它 returns 是一个 const 引用,这意味着您获得的元素无法更改。这保证了你的 const 向量确实是 const 并且不会被改变。

这就是为什么reference at (size_type n) const;是个问题。你说这在 const 对象上使用是安全的,这是对编译器和程序员的谎言,实际上它确实不是,因为它 returns 是一个可变引用,你可以轻松更改使用 at.

获得的元素

问问自己:如果这个程序有效,您不会感到震惊吗?

#include <vector>

int main()
{
    const std::vector<int> a = {1, 2, 3};
    a.at(0) = 10;
}