在C++98中,int a=int();的作用是将变量a初始化为0。

9
在你考虑将问题标记为重复之前,请完整阅读问题。像
int i=int();
这样的语句,大多数程序员会说这里有值初始化,i将被值初始化。(输出为0)。但是在C++98编译器上也会输出0。下面的程序是我在C++98实现上测试的,它给我输出了0。
#include <iostream>
int main()
{
     int i=int();
     std::cout<<i;
}

在上面的C++98程序中,不要说i是值初始化,因为值初始化是在C ++03中引入的。那么这里如何初始化i? 它真的是构造函数调用吗?int()看起来像是构造函数调用。正如Bjarne Stroustrup在他的书C++编程语言和TC ++ PL中所说,原始类型在C ++中也有默认构造函数。

以下链接也说在C ++中原始类型有默认构造函数:

1)http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15

2)http://www.geeksforgeeks.org/c-default-constructor-built-in-types/

那么我可以真正地说它是整数类型的构造函数调用吗?


@vsoftco:这怎么可能? - Destructor
3
据我所知,目前没有一款编译器真正支持 C++98 模式。 - T.C.
1
我不会为你挖掘历史,但如果值初始化的概念是作为纠正C++98行为的缺陷报告引入的,那么编译器甚至会在C++98模式下进行追溯实现。无论如何,为什么还要区分C++98和C++03?只需将后者视为C++标准化后直到C++11的内容即可。 - Praetorian
大多数编译器在C++03和C++98之间没有区别。前者实际上是对后者的错误修复,因此编译器倾向于将它们合并在一起,并在您要求C++98时提供C++03。 - jalf
2
相关链接:https://dev59.com/gIXca4cB1Zd3GeqPOdzj - T.C.
显示剩余3条评论
1个回答

11

5.2.3 显式类型转换(函数符号法)

2 表达式 T(),其中 T 是一个简单类型说明符(7.1.5.2),表示一个非数组完整对象类型或(可能带有cv修饰的)void类型,创建指定类型的rvalue,其值由默认初始化(8.5;对于 void(),不进行任何初始化)。[...]

8.5 初始化

5 [...] 对于类型为 T 的对象进行 默认初始化 意味着:

-- 如果 T 是非POD类类型(第9条款),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非法的);

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

-- 否则,对象的存储将被零初始化。

没有问题。自从最早的C++标准,保证了 int() 将计算为零。它通过默认初始化而不是值初始化发生的这一事实,是与你的问题完全无关的技术细节。


那么,默认构造函数的任务是执行内置类型的默认初始化吗? - Destructor
@meet 当它说“非POD类类型”时,意思是“不是POD类类型的类类型”,而不是“不是POD类类型的类型”。第三项适用:对象的存储被零初始化。没有使用构造函数。 - user743382
内置类型的构造函数何时被调用和使用? - Destructor
但是在他的书《C++程序设计语言》第10.4.2节中,Bjarne Stroustrup说内置类型也有默认构造函数。 - Destructor
让我们在聊天室中继续这个讨论 - Destructor
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接