写入后:
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)吗?还是行为未定义?
nbsp nbsp nbsp nbsp;
constexpr pair();
2需要:
is_default_constructible<first_type>::value
是true
,is_default_constructible<second_type>::value
是true
3效果:值初始化first
和second
。
以及§8.5/7:
要值初始化,类型为
T
的对象意味着:
- 如果
T
是具有用户提供的构造函数的(可能是cv限定的)类类型,则调用T
的默认构造函数(并且如果T
没有可访问的默认构造函数,则初始化形式不正确)- 如果
T
是一个(可能是cv限定的)非并集类类型,没有用户提供的构造函数,则对象为零初始化,如果T
隐式声明的默认构造函数是非平凡的,则调用该构造函数- 如果
T
是数组类型,则对每个元素进行值初始化- 否则,对象初始化为零
最后,§8.5/5:
零初始化
T
类型的对象或引用意味着:
- 如果
T
是标量类型,则将对象设置为值0
(零),作为积分常量表达式,转换为T
- 如果
T
是(可能是cv限定的)非并集类类型,则每个非静态数据成员和每个基类子对象被零初始化,并且填充被初始化为零位- 如果
T
是(可能是cv限定的)并集类型,则对象的第一个非静态命名数据成员被零初始化,填充被初始化为零位- 如果
T
是数组类型,则每个元素被零初始化- 如果
T
是引用类型,则不执行初始化
根据C++11标准,第20.3.2节
constexpr pair();
...
Effects: Value-initializes first and second.
因此,定义明确的是,std::pair<int, int>
对象的默认初始化将导致两个成员都设置为0。
是的,它们初始化为零。引用Bjarne Stroustrup的"C++编程语言"(第三版,第17.4.1.7章):
m[k]
的结果等效于(*(m.insert(make_pair(k,V())).first)).second
的结果,其中V()
是映射类型的默认值。当你理解了等价性,你可能就理解了关联容器。
对于标准引文,默认初始化意味着什么,请查看其他答案。