來段程式好了
這個問題要分成內建type和自定義class
這兩個會有不同的結果
由於要讓違法的語法compile過,所以加上-fpermissive這個flag
<狀況一: 自定義class>
class aaa
{
public:
void modify(int s){i=s;}
void print()const{cout<<i<<endl;}
private:
int i=1;
};
int main()
{
aaa const** aq; //老大
aaa* ap; //老二
const aaa ax; //老三
aq = ≈ //這是被禁止的,但是加上-fpermissive暫時編譯過
*aq = &ax; //由於*aq=ap,所以ap指向ax
ap->modify(5566); //ax.i變成5566 !!! 執行期沒有掛
ax.print();
}
<狀況二: 內建type>
int const** q;
int* p;
const int x=1;
q = &p;
*q = &x;
*p=5566; //x還是1並沒變5566,執行期沒有掛
<結論>
1.基於安全考量所以int **不能轉成int const ** (可以參考上篇po文)
2.自定義class的const物件用走漏洞的方式可以更改
3.內建type的const變數用走漏洞的方式改不動,我不知道為什麼,有請高手解釋
4.執行期都不會掛,執行期應該不會去檢查,這會影響效率