“接受临时”警告

时间:2012-05-10 05:09:13

标签: c++

  

可能重复:
  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行收到此警告? 两者都使用布尔地址。
我怎样才能摆脱这个警告?

2 个答案:

答案 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对象。