2012-05-10 86 views
-2

可能重複:
taking address of temporary while accessing address of a element in vector<bool>「採取的臨時地址」 警告

我得到 '採取的臨時地址' 在第7行警告在下面的代碼段

1 vector<bool> boolVect;<br/> 
2 bool x = true;<br/> 
3 boolVect.push_back(true);<br/> 
4 boolVect.push_back(false);<br/> 
5 ofstream fMetaOut("tmp.txt", ios::out);<br/> 
6 fMetaOut.write((char*)&x, sizeof(bool));<br/> 
7 fMetaOut.write((char*)&boolVect[0], sizeof(bool));<br/> 
8 fMetaOut.close(); 

爲什麼我會在第7行得到這個警告,而不是在6? 兩者都使用布爾地址。
我該如何擺脫此警告?

+9

難道你沒有同樣的問題[五個月前](http://stackoverflow.com/questions/8324699/taking-address-of-temporary-while-accessing-address-of-a-element-in -vectorbool)? – Blastfurnace

+0

對不起。謝謝! – Rahul

+1

@Blastfurnace你沒有辦法記得那個......在那裏?告訴我,你碰到過他的老問題是巧合! –

回答

6

x不是一個臨時的,它是一個l值,一個自動變量駐留在棧上。
雖然,&boolVect[0]不是一個l值。
l-value是一個可以取地址的實體,簡而言之,一個變量的生存期足夠長,可以駐留在內存中,以便可以通過名稱來尋址。

什麼問題vector<bool>?它工作正常vector<int>

C++標準庫提供了布爾類型的矢量專業化。 目標是優化,使用尺寸小於 類型bool類型的常用實現。對於每個元素,bool的通常實現將至少保留1字節。 vector<bool>專業化通常在內部只使用1位元素,所以它通常小八倍。但是這個優化帶有一個價格:
在C++中,最小的可尋址值必須至少有1字節的大小。因此,這種向量的專門化需要對引用和迭代器進行特殊處理。 因此,一個vector<bool>不符合其他載體的所有要求。你看到的行爲就是這樣一個例子,vector<bool>的元素不是一個真正的l值。

+0

什麼是問題與向量 ??它適用於矢量。 – Rahul

+0

@Rahul:精心詳細解釋。 –

2

vector的其他專業不同,vector<bool>不管理bool對象的數組。相反,它管理一個壓縮位域。

由於這些位不是單獨尋址的,因此boolVect[0]不是對bool的引用;它是可轉換爲bool類型的(臨時)對象。沒有辦法獲得一個向量元素的引用或指針。

如果你想要一個可以引用的布爾標誌的容器,那麼vector<char>deque<bool>可能是合適的選擇。

x的地址爲準,因爲它是(非臨時的)bool對象。