typedef unsigned char byte;void fuckme(byte& byValue); // 其他人的介面// 我現在來調用const byte byValue = 11;fuckme(byValue); // 編譯錯誤fuckme(const_cast<byte>(byValue)); // 編譯錯誤fuckme(reinterpret_cast<byte>(byValue)); // 編譯錯誤fuckme((byte)(byValue)); // vs2008下通過,gcc編譯錯誤
找到了兩篇介紹的文章:
強制轉換和引用參數的問題
C++函數, 對非const引用參數不允許做類型轉換,例如:void update(float& i);void g(double d, float r){ update(2.0f); //錯誤 update(r); //傳遞r的引用 update(d); //錯誤,要求類型轉換}一個void函數可以將另一個void函數作為它的return語句中的運算式,例如:void g(int* p);void h(int* p){ return g(p); //可以,返回無值}函數重載只重載參數類型和參數個數,不重載傳回型別在不同的非名字空間範圍裡聲明的函數不算是重載,例如:void f(int);void g(){ void f(double); f(1); //調用f(double)}在同一個範圍中隨後的聲明裡,預設參數都不能重複或者改變,例如:void f(int x = 7);void f(int = 7); //錯誤,預設參數不能重複void f(int = 8); //錯誤,預設參數不能改變void f(int); //可以,函數可以重複聲明void g(){ void f(int x = 9); //可以,這個聲明將遮蔽外層的聲明}void error(string s);void(*f1)(string) = &error; //可以void(*f2)(string) = error; //也可以,與&error意思一樣void g(){ f1("vasa"); //可以 (*f1)("mary rose"); //也可以}宏名字不能重載,而且宏前置處理器不能處理遞迴調用##宏運算子可以拼接兩個串,構造出一個新串,例如:#define NAME2(a,b) a##bint NAME2(hack,cah)();將產生int hackcah();#undef X保證不再用稱為X的有定義的宏--無論在此指令之前有還是沒有。
對非const引用參數不允許做類型轉換
標準規定了只有const &才可以引用臨時對象。你的強制轉換實際上是產生了臨時對象的
如果是強轉的話會產生臨時變數,也就是右值,右值不能賦值給& ,只能賦值給CONST &看來事這個原因了,我用的VS2005沒產生錯誤,看來標準支援的並不好
看來是同類型轉換,編譯做了最佳化處理,並沒有做轉換過程