写完后:
std::pair<int, int> x;
Run Code Online (Sandbox Code Playgroud)
我保证x.first和x.second都是零吗?或者他们可以有任何价值吗?
我之所以关心是因为我试图确定一个值为指针的映射是否保证在访问不在映射中的元素时返回NULL.即,如果我这样做:
std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;
Run Code Online (Sandbox Code Playgroud)
然后我保证得到零(NULL)?或者行为未定义?
ild*_*arn 35
是的,这种保证是正确的.引用C++ 11标准,§20.3.2/ 2-3:
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限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的,并且填充初始化为零位;- if
T
是一个(可能是cv限定的)联合类型,该对象的第一个非静态命名数据成员被零初始化,并且填充被初始化为零位;- if
T
是数组类型,每个元素都是零初始化的;- 如果
T
是引用类型,则不执行初始化.
从C++ 11标准,第20.3.2节
constexpr pair();
...
Effects: Value-initializes first and second.
Run Code Online (Sandbox Code Playgroud)
因此,定义明确的是std::pair<int, int>
对象的默认初始化将导致两个成员都设置为0.