[英]How does compiler determine which function to use?
眾所周知,編譯器通過重載的函數簽名(例如參數類型)來確定函數,但是這是如何工作的:
v[i] = 1;
當編譯器查看以下兩個重載函數時:
const T& operator[](size_t i) const;
T& operator[](size_t i);
如何確定要使用哪個? 編譯器是否嘗試使用第一個,然后發現它不起作用,然后嘗試使用第二個?
如果對象是非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函數)。
非const
成員函數不能在const
對象上調用。
因此,為了在實踐中有用,規則必須是在非const
對象上調用它,相反,在const
對象上調用const
成員函數。
這就是規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.