我是有点害怕的东西是这样的:的std ::地图运营商[],并自动创建新的对象
std::map<DWORD, DWORD> tmap;
tmap[0]+=1;
tmap[0]+=1;
tmap[0]+=1;
由于DWORD的不自动初始化,我总是担心TMAP [0 ]是一个递增的随机数。如果运行时不知道如何执行,地图如何知道如何初始化DWORD?
是否有保证,结果总是tmap[0] == 3
?
我是有点害怕的东西是这样的:的std ::地图运营商[],并自动创建新的对象
std::map<DWORD, DWORD> tmap;
tmap[0]+=1;
tmap[0]+=1;
tmap[0]+=1;
由于DWORD的不自动初始化,我总是担心TMAP [0 ]是一个递增的随机数。如果运行时不知道如何执行,地图如何知道如何初始化DWORD?
是否有保证,结果总是tmap[0] == 3
?
新的对象,当[]
操作插入地图,是值初始化。这是通过地图实现来确保的,即在这个意义上它是“自动”完成的。对于DWORD
类型的对象(假设它是标量类型),值初始化意味着零初始化。
通过23.3.1.2给出的定义,operator []
是
(*((insert(make_pair(x, T()))).first)).second
速记的T()
位为新的对象,这将在你的情况下变成DWORD()
。 DWORD()
保证为零。
我真的不知道内置数据类型存在的值初始化。这让我的生活更轻松! – user331471 2010-05-07 09:22:13
我明白了。但是,如果类型T的默认构造函数很昂贵并且映射已经包含关键字x,那么这个“简写”是痛苦无效的!还是我错了? – user331471 2010-05-07 09:30:15
@ thomas-gies:你是对的,如果按照上面所示的字面顺序执行,它确实是无效的。我希望质量实现以某种方式以更合理的方式实现*等效功能。 – AnT 2010-05-07 09:33:48
是的。通过operator[]
将新值插入到地图中时,它是的值初始化值,对于内置数值类型(DWORD
是内置类型的typedef),这意味着为零。
是的。如果您传递给operator[]
的密钥不存在,则映射将默认构造对象并插入它。在你的情况下,它会做DWORD()
这将产生一个0值
当你使用非标准类型时,比如'DWORD',最好描述它们的真实性,即使你认为“每个人都应该知道”。 – AnT 2010-05-07 08:55:54
不是非常相关,但我真的很讨厌'操作符[]'插入对象到地图,我更喜欢与试图访问'std :: vector' – 2010-05-07 08:56:16
@Viktor中的超范围元素相同的行为:未定义? – 2010-05-07 09:17:22