c++關於類型強轉後作爲引用參數的一些問題
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##b int NAME2(hack,cah)();將產生int hackcah(); #undef X保證不再用稱爲X的有定義的宏--無論在此指令之前有還是沒有。
對非const引用參數不允許做類型轉換
標準規定了只有const &纔可以引用臨時對象。你的強制轉換實際上是產生了臨時對象的
如果是強轉的話會產生臨時變量,也就是右值,右值不能賦值給& ,只能賦值給CONST & 看來事這個原因了,我用的VS2005沒產生錯誤,看來標準支持的並不好
看來是同類型轉換,編譯做了優化處理,並沒有做轉換過程
http://www.cnblogs.com/likebeta/archive/2013/01/16/2862510.html