#include <iostream>
#include <string>
int main() {
std::pair<std::string, int> s;
std::cout << s.second << std::endl;
}
在此示例中,s.second
为0
,但未初始化。您能否提供指向C ++标准的链接,其中定义了为什么是0
。我知道这是因为s.second
由int()
初始化,但无法在标准中找到int()
为0
的行。
答案 0 :(得分:6)
这是
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;[...]