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.这两种方法如何存在于同一个类中?
您无法单独通过返回类型进行区分,但可以通过它们是否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引用和第二种情况下的引用.但如前所述,const从std::vector第二种情况收到的引用被复制为Vec函数的返回值.