在以下代碼中(取自有效的C):
class A { .... char& operator[](std::size_t position) // now just calls const op[] { return const_cast<char&>( // cast away const on op[]'s return type; static_cast<const TextBlock&>(*this) // add const to *this's type; [position] // call const version of op[] ); } const char& operator[](int index) const { ... }}//complete example, tested with VC 2010#include<iostream>#include<string>class TextBlock{public: TextBlock(std::string st):text(st){}; TextBlock(char* cstr): text(cstr){}; TextBlock(const TextBlock& r) { std::cout<<"copy constructor called"<<std::endl; } char& operator[](int index) { std::cout<<"non-const operator"<<std::endl; return const_cast<char&>(static_cast<const TextBlock>(*this)[index]); } const char& operator[](int index) const { std::cout<<"const operator"<<std::endl; return text[index]; }private: std::string text;};int main(){ TextBlock rt("hello"); std::cout<<rt[0]<<std::endl;}
在此代碼中,如果您從const TextBlock&更改static_cast;對(duì)于const TextBlock,這會(huì)導(dǎo)致operator []的非const版本被遞歸調(diào)用.任何人都可以解釋這背后的原因是什么(為什么const TextBlock導(dǎo)致不調(diào)用const成員函數(shù)operator []).
解決方法:
原因是因?yàn)?/p>
const A a();
和
A b();
是不同的對(duì)象,并且在CPP非常量對(duì)象中不能調(diào)用常量函數(shù),反之亦然;因此,您需要為const和非const對(duì)象分別聲明兩次相同的函數(shù).
cout << a[0] << endl;
是合法的,但是
cout << b[0] << endl;
不是.
因此,您應(yīng)該為非const對(duì)象重載[]運(yùn)算符.為了避免復(fù)制代碼,作者建議通過(guò)拋棄其constness來(lái)使用const對(duì)象的函數(shù).出于這個(gè)原因,你得到:
char& operator[](std::size_t position){ return const_cast <char &>( static_cast <const A &>(*this) [position] );}
換句話說(shuō),您只需將對(duì)象轉(zhuǎn)換為const
char& operator[](std::size_t position){ const A temp = *this; //create a const object //and assign current object to it ....}
嘗試使用const obj的[]運(yùn)算符
char& operator[](std::size_t position){ const A temp = *this; //create a const object //and assign current object to it return temp[position]; // call an overloaded operator [] // of the const function}
得到一個(gè)錯(cuò)誤,因?yàn)閏onst函數(shù)的[]運(yùn)算符返回const char&并且此函數(shù)返回char& ;.因此施放常數(shù)
char& operator[](std::size_t position){ const A temp = *this; //create a const object //and assign current object to it return const_cast <char &>( temp[position] ); }
現(xiàn)在你完成了.問(wèn)題是:“如何
const A temp = *this;return const_cast <char &> (temp[position]);
成了這個(gè):
return const_cast <char &> ( static_cast <const A &> (*this)[position]);
?原因是當(dāng)你使用temp時(shí) – 你正在對(duì)const對(duì)象進(jìn)行非const的隱式轉(zhuǎn)換,因此你可以替換:
const A temp = *this; // implicit cast
同
const A temp = static_cast <const A &> (*this) //explicit
這也有效:
const A temp = const_cast <const A &> (*this)
因?yàn)槟憧梢宰鲆粋€(gè)明確的演員 – 你不再需要一個(gè)臨時(shí)演員,因此:
return const_cast <char &> (static_cast <const A &>(*this)[position]);
這將從這個(gè)const-casted對(duì)象返回一個(gè)非const引用,該對(duì)象調(diào)用一個(gè)重載的運(yùn)算符[] :)正是因?yàn)檫@個(gè)原因你不能使用
return const_cast <char &> ((*this)[position]);
因?yàn)檫@是一個(gè)非const對(duì)象;因此,它將調(diào)用非成本函數(shù)(重載operator []),這將導(dǎo)致無(wú)限遞歸.
希望它有意義.
來(lái)源:https://www.icode9.com/content-4-415151.html聯(lián)系客服