引用具有相同参数签名的operator []方法返回的double和double

Aar*_*onF 3 c++ templates operator-overloading

我正在维基百科上阅读一篇关于表达模板的文章.

https://en.wikipedia.org/wiki/Expression_templates#Motivation_and_example

在本节中,有两种公共方法:

double &operator[](size_t i)      { return elems[i]; }
double operator[](size_t i) const { return elems[i]; }
Run Code Online (Sandbox Code Playgroud)

第一个似乎返回一个非const引用到double,而第二个返回一个const double.这两种方法如何存在于同一个类中?

wal*_*lly 5

您无法单独通过返回类型进行区分,但可以通过它们是否const对对象的实例进行操作来区分不同的成员函数.

使用链接中的代码的示例:

#include <vector>
#include <assert.h>

class Vec {
    std::vector<double> elems;

public:
    Vec(size_t n) : elems(n) {}

    double &operator[](size_t i) { return elems[i]; }
    double operator[](size_t i) const { return elems[i]; }
    size_t size()               const { return elems.size(); }
};

Vec operator+(Vec const &u, Vec const &v) {
    assert(u.size() == v.size());
    Vec sum(u.size());
    for(size_t i = 0; i < u.size(); i++) {
        sum[i] = u[i] + v[i];
    }
    return sum;
}

int main()
{
    Vec vec1{5};
    auto val1 = vec1[2]; // calls the first
    const Vec vec1r{5};
    auto val1c = vec1r[2]; // calls the second
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么可以为一个方法elems[i]返回一个引用,并double为另一个方法elems[i]返回一个double

这些是不同的功能:

double &operator[](size_t i);
double operator[](size_t i) const;
Run Code Online (Sandbox Code Playgroud)

所以可能会返回不同的类型.

Elems是一个std::vector<double>.如何elems[i]有时候返回一个 参考double,有时返回double

在第一种情况下不复制该值,仅返回引用.在第二种情况下复制返回值.

std::vector<double>::operator[]返回第一种情况下的const引用和第二种情况下的引用.但如前所述,conststd::vector第二种情况收到的引用被复制Vec函数的返回值.