正如我们所知,编译器通过重载函数签名(如参数类型)来确定函数,但是这个函数如何工作:
v[i] = 1;
当编译器查看这两个重载函数时:
const T& operator[](size_t i) const;
T& operator[](size_t i);
如何确定使用哪一个?编译器是否尝试使用第一个,并发现它不起作用,然后它尝试使用第二个?
答案 0 :(得分:3)
如果对象是非const,则调用函数的非const版本(如果可用),否则调用const版本。现在看看哪个是:
const T& operator[](size_t i) const; //CONST MEMBER FUNCTION
T& operator[](size_t i); //NON-CONST MEMBER FUNCTION
一个例子,
void f(std::vector<int> const &v1, std::vector<int> & v2)
{
std::cout << v1[0] << std::endl; //invokes const version
std::cout << v2[0] << std::endl; //invokes non-const version
}
现在你写的时候:
v[i] = 1;
如果我不认为v
是std::vector
,那么它取决于v
的常数。如果v
是const,那么将调用const-version,否则将调用非const版本(如果可用,否则v
将转换为const对象,然后将调用const函数)
答案 1 :(得分:1)
无法在const
对象上调用非const
成员函数。
因此,为了实际有用,规则必须是在非const
对象上调用它,相反,const
成员函数在{{1}上调用对象。
这就是规则。