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

Edw*_*per 39 c++

写完后:

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>::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限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的,并且填充初始化为零位;
  • if T是一个(可能是cv限定的)联合类型,该对象的第一个非静态命名数据成员被零初始化,并且填充被初始化为零位;
  • if T是数组类型,每个元素都是零初始化的;
  • 如果T是引用类型,则不执行初始化.

  • @André:`int`没有默认构造函数,默认初始化`int`会使其值未定义.这里使用的是_value-initialization_. (7认同)

Pra*_*ian 5

从C++ 11标准,第20.3.2

constexpr pair();
...
Effects: Value-initializes first and second.
Run Code Online (Sandbox Code Playgroud)

因此,定义明确的是std::pair<int, int>对象的默认初始化将导致两个成员都设置为0.