可能重复:
taking address of temporary while accessing address of a element in vector<bool>
我得到了临时&#39;在下面的代码中第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行收到此警告?
两者都使用布尔地址。
我怎样才能摆脱这个警告?
答案 0 :(得分:6)
x
不是临时的,它是一个l值,一个驻留在堆栈上的自动变量。
虽然&boolVect[0]
不是l值
l-value是一个可以获取其地址的实体,简言之,该变量的生存期足够长,可以驻留在内存中,以便可以通过名称进行寻址。
vector<bool>
有什么问题?它适用于vector<int>
C ++标准库为布尔类型提供了vector的特化。
目标是优化,使用比通常实现更小的尺寸
类型为bool
的向量。 bool
的通常实现将为每个元素保留至少1
个字节。 vector<bool>
特化通常仅在内部使用1
位作为元素,因此通常小8倍。但这种优化需要付出代价:
在C ++中,最小可寻址值的大小必须至少为1
个字节。因此,向量的这种特化需要对引用和迭代器进行特殊处理。
结果,vector<bool>
不满足其他向量的所有要求。您看到的行为就是一个这样的例子,vector<bool>
的元素不是真正的l值。
答案 1 :(得分:2)
与vector
的其他专精不同,vector<bool>
不管理bool
个对象的数组。相反,它管理一个打包的位域。
由于这些位不能单独寻址,boolVect[0]
不是对bool
的引用;它是一个可以转换为bool
的类型的(临时)对象。无法获得向量元素的引用或指针。
如果你想要一个可以引用的布尔标志容器,那么vector<char>
或deque<bool>
可能是合适的选择。
取x
的地址很好,因为它是(非临时的)bool
对象。