std::pair的默认构造函数<>将基本类型(int等)设置为零



写入后:

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:

 nbsp nbsp nbsp nbsp;constexpr pair();

2需要:is_default_constructible<first_type>::valuetrueis_default_constructible<second_type>::valuetrue
3效果:值初始化firstsecond

以及§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()是映射类型的默认值。当你理解了等价性,你可能就理解了关联容器。

对于标准引文,默认初始化意味着什么,请查看其他答案。

相关内容

  • 没有找到相关文章

最新更新