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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章