Cha*_*nce 7 c++ gcc stl initialization map
这是代码摘录.
std::map<double, double> temp;
temp[0] = .1;
cout << temp[1] << endl;
// result varies based on compiler
Run Code Online (Sandbox Code Playgroud)
我正在使用GCC版本4.4.1进行编译temp[1],正如我所料,我得到的值为0 .我的同事正在编译GCC 4.5.1版.在调试模式下(带有-g标志),他得到了1000.在编译发布模式(-O2标志)时,他得到了0.
我的想法是,这是通常在未初始化的变量中出现的问题类型,除了地图应该基于这个问题以及其他几个类似的问题调用其元素上的默认构造函数.
此外,Josuttis 的C++标准库说明了这一点
如果使用键作为索引,但尚未存在任何元素,则会自动将新元素插入到地图中.new元素的值由其类型的默认构造函数初始化.
为什么地图中的元素在调试模式下没有在GCC 4.5.1中初始化?我不理解别人对这种行为的正确看法吗?新元素的默认构造是否不一定是标准的一部分?或者这可能是编译器中的实际错误?
正如人们所期望的那样,代码摘录是实际情况的简化版本。事实证明,在地图上使用了 find 命令,因此本质上map.find(1)->second是被调用,而不是简单地调用map[1]. 这解释了未定义的行为。