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

2021-09-06 07:49:26 字數 1439 閱讀 8930

typedef unsigned char

byte

;void ****me(byte& byvalue); //

其他人的介面

//我現在來呼叫

const

byte byvalue = 11

;****me(byvalue);

//編譯錯誤

****me(const_cast(byvalue)); //

編譯錯誤

****me(reinterpret_cast(byvalue)); //

編譯錯誤

****me((byte)(byvalue)); //

vs2008下通過,gcc編譯錯誤

找到了兩篇介紹的文章: 

c++函式,  對非const引用引數不允許做型別轉換,例如:

void update(float&i);

void g(double d, float

r)乙個void函式可以將另乙個void函式作為它的return語句中的表示式,例如:

void g(int*p);

void h(int*p)

函式過載只過載引數型別和引數個數,不過載返回型別

在不同的非名字空間作用域裡宣告的函式不算是過載,例如:

void f(int

);void

g()在同乙個作用域中隨後的宣告裡,預設引數都不能重複或者改變,例如:

void f(int x = 7

);void f(int = 7); //

錯誤,預設引數不能重複

void f(int = 8); //

錯誤,預設引數不能改變

void f(int); //

可以,函式可以重複宣告

void

g()void error(string

s);void(*f1)(string) = &error; //

可以void(*f2)(string) = error; //

也可以,與&error意思一樣

void

g()巨集名字不能過載,而且巨集預處理器不能處理遞迴呼叫

##巨集運算子可以拼接兩個串,構造出乙個新串,例如:

#define name2(a,b) a##b

intname2(hack,cah)();將產生int hackcah();

#undef x保證不再用稱為x的有定義的巨集--無論在此指令之前有還是沒有。

標準規定了只有const &才可以引用臨時物件。你的強制轉換實際上是產生了臨時物件的

如果是強轉的話會產生臨時變數,也就是右值,右值不能賦值給& ,只能賦值給const &看來事這個原因了,我用的vs2005沒產生錯誤,看來標準支援的並不好

看來是同型別轉換,編譯做了優化處理,並沒有做轉換過程

C 引用型別作為函式引數時

在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...

C 引用型別作為函式引數時

在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...

C 引用型別作為函式引數時

在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...