其中定义了int()为0
Where is defined that int() is 0?
#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
的行。
如果对象的初始化式是一组空括号,即(),则该对象应进行值初始化。
和
对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;[…]
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 当我尝试定义这个向量时<pair<int , pair<int, int> > > vp(n)
- 定义 uint= "unsigned int" 没有像我在 Visual Studio 中使用 nvcc 时预期的那样应用
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 如何定义int[][26]类型的变量
- 从 int 显式转换为用户定义的类 c++
- 对'cv::VideoCapture::VideoCapture(int)的未定义引用
- 是否打印指向已定义 int 的成员指针
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- 从emxArray_uint8_T检测到错误:.text+0xc1):未定义对"emxInit_uint8_T1(emxArray_uint8_T**, int)"的引用?
- 对 'i2c_smbus_read_word_data(int, 无符号字符)的未定义引用
- 如何从输入中定义的"external" int 定义结构中的数组大小
- 在我的项目中包括eigen将标准INT定义为eigen :: denseIndex-如何使用正常INT
- 数据类型是否"int"定义为类?
- 为什么 sqrt() 在 int 变量上工作正常,如果它不是为 int 定义的
- 将默认int定义为unsigned int
- 为[z][y][x]int定义数组int[x][y][z]有什么好处?
- 用Const int定义数组