C++ 在哪里定义int()为0?

C++ 在哪里定义int()为0?,c++,standards,C++,Standards,在本例中,s.second为0,但未初始化。你能提供一个链接到C++标准,在哪里定义它为什么是0?我知道这是因为s.second由int初始化,但在标准中找不到int为0的行。它是 8.5初始值设定人[dcl.init] 10初始值设定项为空括号集的对象,即,应进行值初始化 及 7值初始化T类型的对象意味着: -如果T是第9条中可能的cv限定类类型,且具有用户提供的构造函数12.1,则 调用T的默认构造函数,如果T没有可访问的默认值,则初始化是错误的 建造师; -如果T可能是cv限定的非联合类类

在本例中,s.second为0,但未初始化。你能提供一个链接到C++标准,在哪里定义它为什么是0?我知道这是因为s.second由int初始化,但在标准中找不到int为0的行。

它是

8.5初始值设定人[dcl.init] 10初始值设定项为空括号集的对象,即,应进行值初始化

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

我猜

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

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

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

根据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 0,作为整型常量表达式,转换为T

-[……]

我知道这是因为秒是由int初始化的

该标准实际上并没有说second是用int初始化的。它只是给出了使用默认构造函数创建std::pair的效果,如§20.3.2所示:

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

值初始化定义为§8.5:

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

如果T可能是cv限定类类型,则第9条[…]

如果T可能是cv限定的非并集类类型[…]

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

否则,对象初始化为零

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

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

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

[……]


另请参见,但它在何处表示初始化的值int==0?@MFONTANI添加了相关部分。@MFONTANI还添加了其中初始化的0实际上意味着0的内容:@LuchianGrigore您可以提供一个指向您使用的标准文件的链接。我没有在这里找到7部分@Ashot:我在我的回答中提供了一个链接到一个最近的草案,原始ISO标准不是免费的。
#include <iostream>
#include <string>

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