2010-05-07 60 views
1

我是有点害怕的东西是这样的:的std ::地图运营商[],并自动创建新的对象

std::map<DWORD, DWORD> tmap; 
    tmap[0]+=1; 
    tmap[0]+=1; 
    tmap[0]+=1; 

由于DWORD的不自动初始化,我总是担心TMAP [0 ]是一个递增的随机数。如果运行时不知道如何执行,地图如何知道如何初始化DWORD?

是否有保证,结果总是tmap[0] == 3

+0

当你使用非标准类型时,比如'DWORD',最好描述它们的真实性,即使你认为“每个人都应该知道”。 – AnT 2010-05-07 08:55:54

+1

不是非常相关,但我真的很讨厌'操作符[]'插入对象到地图,我更喜欢与试图访问'std :: vector' – 2010-05-07 08:56:16

+0

@Viktor中的超范围元素相同的行为:未定义? – 2010-05-07 09:17:22

回答

3

新的对象,当[]操作插入地图,是值初始化。这是通过地图实现来确保的,即在这个意义上它是“自动”完成的。对于DWORD类型的对象(假设它是标量类型),值初始化意味着零初始化。

通过23.3.1.2给出的定义,operator []

(*((insert(make_pair(x, T()))).first)).second 

速记的T()位为新的对象,这将在你的情况下变成DWORD()DWORD()保证为零。

+0

我真的不知道内置数据类型存在的值初始化。这让我的生活更轻松! – user331471 2010-05-07 09:22:13

+0

我明白了。但是,如果类型T的默认构造函数很昂贵并且映射已经包含关键字x,那么这个“简写”是痛苦无效的!还是我错了? – user331471 2010-05-07 09:30:15

+0

@ thomas-gies:你是对的,如果按照上面所示的字面顺序执行,它确实是无效的。我希望质量实现以某种方式以更合理的方式实现*等效功能。 – AnT 2010-05-07 09:33:48

4

是的。通过operator[]将新值插入到地图中时,它是的值初始化值,对于内置数值类型(DWORD是内置类型的typedef),这意味着为零。

0

是的。如果您传递给operator[]的密钥不存在,则映射将默认构造对象并插入它。在你的情况下,它会做DWORD()这将产生一个0值