在哪里定义int()为0?

时间:2013-03-21 13:22:45

标签: c++ standards

#include <iostream>
#include <string>

int main() {
    std::pair<std::string, int> s;
    std::cout << s.second << std::endl;
}

在此示例中,s.second0,但未初始化。您能否提供指向C ++标准的链接,其中定义了为什么是0。我知道这是因为s.secondint()初始化,但无法在标准中找到int()0的行。

3 个答案:

答案 0 :(得分:6)

这是

8.5初始值设定项[dcl.init]

  

10)初始值为空的括号集的对象,即(),应进行值初始化。

  

7)对T类型的对象进行值初始化意味着:
   - 如果T是一个(可能是cv限定的)类类型(第9条),带有用户提供的构造函数(12.1),那么   调用T的默认构造函数(如果T没有可访问的默认值,则初始化是错误的   构造函数);
   - 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象   是零初始化,如果T的隐式声明的默认构造函数是非平凡的,那么构造函数是   调用。
   - 如果T是数组类型,则每个元素都是值初始化的;
   - 否则,该对象为零初始化。

我想

  

5)零初始化T类型的对象或引用意味着:
   - 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,   转换为T; [...]

答案 1 :(得分:5)

  

我知道这是因为s.second是由int()初始化的,但是在标准中找不到int()为0的行。

以下是您在C ++ 11标准中必须遵循的路径 - 此答案使用Draft n3485作为参考,这比当前的官方标准更新。

根据C ++ 11标准的第8.5 / 11段:

  

一个对象,其初始化程序是一组空的括号,即(),应为值初始化。 [...]

此外,根据C ++ 11标准的第8.5 / 8段:

  

值初始化,T类型的对象意味着:

     

- 如果T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者   用户提供或删除的默认构造函数,然后该对象被默认初始化;

     

- 如果T是一个(可能是cv限定的)非联合类类型,没有用户提供或删除的默认构造函数,   那么该对象是零初始化的,如果T有一个非平凡的默认构造函数,则默认初始化;

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化

最后(尽管这很直观),按照第8.5 / 6段的规定:

  

零初始化 T类型的对象或引用意味着:

     

- 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T;

     

- [...]

答案 2 :(得分:3)

  

我知道这是因为s.second是由int()

初始化的

标准实际上并未说明second已使用int()初始化。它只是使用默认构造函数创建std::pair的效果为(§20.3.2):

  

效果:值初始化第一个和第二个。

值初始化定义为(§8.5):

  

value-initialize T类型的对象意味着:

     
      
  • 如果T是(可能是cv认证的)类类型(第9条)[...]

  •   
  • 如果T是(可能是cv合格的)非联合类类型[...]

  •   
  • 如果T是数组类型,[...]

  •   
  • 否则,该对象为零初始化。

  •   

Whcih导致second被零初始化,因为它是int(§8.5):

  

零初始化 T类型的对象或引用意味着:

     
      
  • 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T;

  •   
  • [...]

  •