其中定义了int()为0

Where is defined that int() is 0?

本文关键字:int 定义      更新时间:2023-10-16
#include <iostream>
#include <string>
int main() {
    std::pair<std::string, int> s;
    std::cout << s.second << std::endl;
}

在这个例子中,s.second0,尽管它没有初始化。你能提供一个链接到c++标准在哪里定义为什么是0。我知道这是因为s.second是由int()初始化的,但在标准中找不到int()0的行。

8.5初始化[dcl.init]

如果对象的初始化式是一组空括号,即(),则该对象应进行值初始化。

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

and I guess

对T类型的对象或引用进行零初始化意味着:
—如果T是标量类型(3.9),则将对象设为值0(零),作为积分常数表达式;转换成T;[…]

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

这是c++ 11标准中你必须遵循的路径——这个答案使用草案n3485作为参考,它比当前的官方标准更新。

c++ 11标准第8.5/11段:

初始化式为空圆括号的对象(即())应为value-initialized。[…]

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

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

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

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

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

- ,否则为零初始化

最后(虽然这很直观),根据第8.5/6段:

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

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

— [...]

我知道这是因为s.s second是通过int()初始化的

标准并没有说second是用int()初始化的。它只提供了使用默认构造函数(§20.3.2)创建std::pair的效果:

Effects: value - initialization first and second.

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

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

  • 如果T是(可能是cv合格的)类类型(条款9)[…]

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

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

  • ,否则为零初始化。

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

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

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

  • […]