'const'在operator()重载中做了什么?

avd*_*avd 3 c++ operator-overloading

我有一个代码库,在Matrix类中,这两个定义适用于()运算符:

template <class T> T& Matrix<T>::operator() (unsigned row, unsigned col)
{
    ......
}


template <class T> T Matrix<T>::operator() (unsigned row, unsigned col) const
{
    ......
}
Run Code Online (Sandbox Code Playgroud)

我理解的一件事是,第二个不返回引用,但const在第二个声明中意味着什么?当我说的时候还调用哪个函数mat(i,j)

Unc*_*ens 6

调用哪个函数取决于实例是否为const.第一个版本允许您修改实例:

 Matrix<int> matrix;
 matrix(0, 0) = 10;
Run Code Online (Sandbox Code Playgroud)

如果你有一个Matrix的const实例(引用),const重载允许只读访问:

 void foo(const Matrix<int>& m)
 {
     int i = m(0, 0);
     //...
     //m(1, 2) = 4; //won't compile
 }
Run Code Online (Sandbox Code Playgroud)

第二个不返回引用,因为意图是禁止修改对象(您获得值的副本,因此无法修改矩阵实例).

这里T应该是一个简单的数字类型,便宜(呃)按值返回.如果T也可能是一个更复杂的用户定义类型,那么const重载通常会返回一个const引用:

 template <class T>
 class MyContainer
 {
      //..,
      T& operator[](size_t);
      const T& operator[](size_t) const;
 }
Run Code Online (Sandbox Code Playgroud)