C++ 映射的空指针值
在我的代码中,我有一个C++ 映射的空指针值,c++,map,C++,Map,在我的代码中,我有一个std::map,看起来像这样: std::map<std::string, A*> myMap; 我知道将使用该键创建一个新元素,但我希望指针初始化为NULL。换句话说,如果myMap[s]存在,则应返回有效指针。如果不是,我希望在执行上述代码后pA为空 默认情况下,如果myMap[s]不退出,pA会包含垃圾吗?如果元素不退出,如何使pA包含NULL值?是的,映射中用于int或pointer等嵌入式类型的新元素已初始化为零,因此指针将为NULL。是的,映射中
std::map
,看起来像这样:
std::map<std::string, A*> myMap;
我知道将使用该键创建一个新元素,但我希望指针初始化为NULL。换句话说,如果myMap[s]
存在,则应返回有效指针。如果不是,我希望在执行上述代码后pA为空
默认情况下,如果
myMap[s]
不退出,pA会包含垃圾吗?如果元素不退出,如何使pA包含NULL值?是的,映射中用于int或pointer等嵌入式类型的新元素已初始化为零,因此指针将为NULL。是的,映射中用于int或pointer等嵌入式类型的新元素已初始化为零,因此指针将为NULL。简短回答:是,在没有先验值的新键查找中,可以可靠地将指针视为nullptr
长答覆:
根据标准:
C++11第23.4.4.3节,第5节
T&operator[](按键类型和&x)代码>
效果:如果地图中没有与x等价的键,则将value\u type(std::move(x),T())
插入地图
请特别注意使用T()
,在本例中,T
是指针类型。这导致
C++11第8.5节,第10页
初始值设定项为空括号集的对象,即(),应为值初始化的对象
根据值初始化的定义:
C++11§8.5,第7页
初始化T类型对象的值意味着:
- 如果T是一个(可能是cv限定的)类类型(第9条),具有用户提供的构造函数(12.1),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)
- 如果T是一个(可能是cv限定的)非联合类类型,没有用户提供的构造函数,那么对象是零初始化的,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数
- 如果T是数组类型,则每个元素都初始化为值
- 否则,对象将初始化为零。
这就引出了零初始化对象类型的含义:
C++11第8.5节第5节
将类型为T的对象或引用初始化为零意味着:
- 如果T是标量类型(3.9),则对象被设置为值0(零),作为积分常量表达式,转换为T(103)
- 如果T是(可能是cv限定的)非并集类类型,则每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位
- 如果T是(可能是cv限定的)联合类型,则对象的第一个非静态命名数据成员被初始化为零,填充被初始化为零位
- 如果T是数组类型,则每个元素初始化为零
- 如果T是引用类型,则不执行初始化
103)如4.10所述,将值为0的整型常量表达式转换为指针类型会导致空指针值
简短回答:是的,在没有先验值的新键查找中,可以可靠地将指针视为nullptr
长答覆:
根据标准:
C++11第23.4.4.3节,第5节
T&operator[](按键类型和&x)代码>
效果:如果地图中没有与x等价的键,则将value\u type(std::move(x),T())
插入地图
请特别注意使用T()
,在本例中,T
是指针类型。这导致
C++11第8.5节,第10页
初始值设定项为空括号集的对象,即(),应为值初始化的对象
根据值初始化的定义:
C++11§8.5,第7页
初始化T类型对象的值意味着:
- 如果T是一个(可能是cv限定的)类类型(第9条),具有用户提供的构造函数(12.1),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)
- 如果T是一个(可能是cv限定的)非联合类类型,没有用户提供的构造函数,那么对象是零初始化的,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数
- 如果T是数组类型,则每个元素都初始化为值
- 否则,对象将初始化为零。
这就引出了零初始化对象类型的含义:
C++11第8.5节第5节
将类型为T的对象或引用初始化为零意味着:
- 如果T是标量类型(3.9),则对象被设置为值0(零),作为积分常量表达式,转换为T(103)
- 如果T是(可能是cv限定的)非并集类类型,则每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位
- 如果T是(可能是cv限定的)联合类型,则对象的第一个非静态命名数据成员被初始化为零,填充被初始化为零位
- 如果T是数组类型,则每个元素初始化为零
- 如果T是引用类型,则不执行初始化
103)如4.10所述,将值为0的积分常数表达式转换为
std::string s("hello");
A* pA = myMap[s];