为什么我们有单独的函数返回const和非const?

时间:2016-12-07 20:25:17

标签: c++ operator-overloading const

根据http://www.example.comstd::vector::operator[]有两个重载:

      reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

为什么我们需要该功能的const版本?或者,为什么我们不写一个非const函数?

例如,在以下代码中:

std::vector<int> a = {1, 2, 3, 4, 5};
int b = a[1] + a[3];  // Why does it matter if this is const?

3 个答案:

答案 0 :(得分:5)

当对象本身被声明为const时,将调用

const重载。例如,如果operator[]上只有std::vector的非常量重载,则以下代码将拒绝编译:

const std::vector<int> a{10, 20, 30};
int y = a[0];

另一方面,如果我们没有非常量过载,则会失败:

std::vector<int> a{10, 20, 30};
a[0] = 15;

最后,但并非最不重要的是,这些函数都没有返回rvalue。两者都返回lvalue

答案 1 :(得分:0)

const版本用于允许元素访问(只读)常量向量。 没有它,const向量将是WOM

该函数返回一个const引用,这意味着您不能为其分配新值,但可以将其复制到别处(如果它是可复制的)。

答案 2 :(得分:0)

参考返回版本可以使用括号表示法修改向量:

a[1] = -1;

由于左侧的对象是对向量中条目的引用,因此实际上修改了向量。

const_reference返回版本可以访问const向量的元素。

const vector<int> a {1, 3};
int x = a[0];

如果没有const_reference重载,这将无法编译。