2011-05-02 63 views
3

如果您有一個整型t1和一個函數通過引用獲得可能較小的整型t2,調用函數((t2)var_t1)會有問題嗎?通過引用傳遞的整型類型

+0

C++和C是不同的語言。我已經刪除了C標籤。 – 2011-05-02 14:47:57

回答

2

當且僅當該功能拿了const引用,在這種情況下,由投產生的t2臨時可以綁定到這將是罰款,強制轉換爲t2

既然這樣會導致整數類型的引用的目的,我會假定引用是非常量的,所以答案是:是的,這是有問題的。要清楚的是,如果您投射到t2,它甚至不會編譯。

如果你想function修改t1變量只有部分,在參考/指針使用reinterpret_cast。當然,這在理論上會調用未定義的行爲。

+1

只要記住,這種行爲的不確定性在大端平臺上不是那麼理論化,它會修改變量的錯誤部分。真正的大端平臺正在變得越來越稀少,但它們絕對不會絕跡。 – 2011-05-02 11:42:16

+0

確實如此,但它在Big Endian上與Little Endian中的未定義一樣。但是如果目標架構是已知的,那麼結果應該是可以預測的,這就是我所說的'理論'。當然,這並沒有讓它變得更好...... – 2011-05-02 11:46:15

1

投射會創建一個臨時的,如果較小的類型不採用const參考,您的代碼將不會編譯,因爲暫時不能綁定到非常量引用。

如果確實需要const參考,那麼它會進行編譯,但是可能會導致溢出,這是將較大數據類型轉換爲較小數據類型時的常見問題。

1

函數將不得不採取const引用,否則它不會編譯。

0

由於您還標記了問題C,在這種情況下,「通過引用」意味着使用指針,因此無法將&運算符應用於演員表的結果。但是,你可以使用:

function((t2 [1]){ (t2)var }); 

注意,是有效C,但不是C++,你不應該混合C和C++代碼的原因之一......