Stringクラスに2つのオーバーロードされたメンバー関数(constバージョンとnon-constバージョン)があると仮定します。
char & String::operator[](int i) //Version 1
{
cout<<"char & String::operator[](int i) get invoked."<<std::endl;
return str[i];
}
const char & String::operator[](int i) const //Version 2
{
cout<<"const char & String::operator[](int i) const get invoked."<<std::endl;
return str[i];
}
テストコードの断片があります
int main(){
String a;
cout<<a[0]<<endl; //Line 1
a[0]='A'; //Line 2
}
コンパイラはどの関数を呼び出すかをどのように決定しますか?プログラムを実行すると、バージョン1が常に呼び出されることがわかりました。なぜそうなのか誰か教えてもらえますか?そして、バージョン2はどのように呼び出されますか?