为什么 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
引用,这意味着它可以改变。这违背了 const
ing 你的对象的想法,这就是为什么这个特定的重载不适用于 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;
}
我正在尝试实施 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
引用,这意味着它可以改变。这违背了 const
ing 你的对象的想法,这就是为什么这个特定的重载不适用于 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;
}