写完后:
std::pair<int, int> x;
我能保证 x.first 和 x.second 都为零吗?或者它们有什么价值吗?
我关心的原因是因为我试图确定如果我访问不在映射中的元素,值是指针的映射是否保证返回 NULL。也就是说,如果我这样做:
std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;
那么我能保证得到零(NULL)吗?或者行为未定义?
是的,这个保证是正确的。引用 C++11 标准,§20.3.2/2-3:
constexpr pair();
2 要求: is_default_constructible<first_type>::value
is true
and is_default_constructible<second_type>::value
is true
.
3 Effects:值初始化first
and second
.
和§8.5/7:
To 值初始化类型的对象T
means:
- if
T
是一个(可能是 cv 限定的)类类型,具有用户提供的构造函数,然后是默认构造函数T
被调用(并且初始化是错误的,如果T
没有可访问的默认构造函数);
- if
T
是一个(可能是 cv 限定的)非联合类类型,没有用户提供的构造函数,则该对象是零初始化的,并且,如果T
的隐式声明的默认构造函数非常重要,该构造函数被调用。
- if
T
是数组类型,那么每个元素都是值初始化的;
-
否则,该对象将被零初始化.
最后,§8.5/5:
To 零初始化类型的对象或引用T
means:
-
if
T
是标量类型,对象被设置为值0
(零),作为整型常量表达式,转换为T
;
- if
T
是一个(可能是 cv 限定的)非联合类类型,每个非静态数据成员和每个基类子对象都初始化为零,并且填充初始化为零位;
- if
T
是一个(可能是 cv 限定的)联合类型,对象的第一个非静态命名数据成员被零初始化,并且填充被初始化为零位;
- if
T
是数组类型,每个元素都初始化为零;
- if
T
是引用类型,不执行初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)