编译器如何确定使用哪个函数?

时间:2013-12-07 06:17:02

标签: c++ compiler-construction operator-overloading

正如我们所知,编译器通过重载函数签名(如参数类型)来确定函数,但是这个函数如何工作:

v[i] = 1;

当编译器查看这两个重载函数时:

const T& operator[](size_t i) const;
T& operator[](size_t i);

如何确定使用哪一个?编译器是否尝试使用第一个,并发现它不起作用,然后它尝试使用第二个?

2 个答案:

答案 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; 

如果我不认为vstd::vector,那么它取决于v的常数。如果v是const,那么将调用const-version,否则将调用非const版本(如果可用,否则v将转换为const对象,然后将调用const函数)

答案 1 :(得分:1)

无法在const对象上调用非const成员函数。

因此,为了实际有用,规则必须是在非const对象上调用它,相反,const成员函数在{{1}上调用对象。

这就是规则。