c++關於類型強轉後作為引用參數的一些問題

來源:互聯網
上載者:User
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沒產生錯誤,看來標準支援的並不好
看來是同類型轉換,編譯做了最佳化處理,並沒有做轉換過程

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.