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];