[英]Do built-in types have default constructors?
读完这篇文章后,我指出int ()
产生 0 是因为临时int
是值初始化的,而不是因为int()
调用了int
的默认构造函数。 (根据我的理解,这篇文章有缺陷。)
我还说过原始(内置)类型没有构造函数。 原作者让我检查 $10.4.2 (TC++PL) 部分说
内置类型也有默认构造函数 ($6.2.8)
但我仍然认为声明“C++ 甚至允许内置类型(原始类型)具有默认构造函数。” 有缺陷(根据 C++03)。
我认为 TC++PL 中的 Bjarne 将“构造函数之类的符号 ie ()
”与实际的构造函数调用混为一谈。 Bjarne在写这本书的时候没有引入值初始化,对吧? 那么 TC++PL 中的文本是否按照 C++98 和 C++03 不正确?
你们有什么感想?
编辑
我亲自(通过邮件)询问 Bjarne 关于 TC++PL 中的有缺陷的文本,这是他的答复
我认为您将“实际的构造函数调用”与概念上的构造函数混淆了。 内置类型被认为具有构造函数(标准用于描述其行为的任何词)。
简单的答案:技术上没有。
长答案:
不。
但是您用来初始化它们的语法使它们看起来像是由默认构造函数或默认复制构造函数构造的。
int x(5); // Looks like a constructor. Behaves like one: x is initialized.
int y(); // Fail. Actually a function declaration.
// BUT
int z = int(); // Looks like a constructor. Behaves like a constructor (0 init).
int a(b); // Again.
所以从技术上讲,基本 POD 类型没有构造函数。 但是对于所有意图和目的,它们的行为就像它们有一个复制构造函数和默认构造函数(当用大括号初始化时)。
如果它看起来像一只鸭子并且叫起来像一只鸭子,那么它非常像鸭子。
构造函数是一个成员函数(在 C++ 标准的第 12 条中完全指定了构造函数,其中涵盖了特殊的成员函数,如构造函数和析构函数)。
成员函数只能为类类型定义(C++03 9.3/1 说“在类定义中声明的函数,不包括那些用友元说明符声明的函数,称为该类的成员函数”)。
所以非类类型(包括基本类型、数组类型、引用类型、指针类型和枚举类型)没有构造函数。
我没有C++ 编程语言的副本来阅读“内置类型也有默认构造函数”这句话的上下文,但我猜想 Stroustrup 要么在松散的、非- 技术意义,或术语的含义或在标准中使用它的方式在书籍出版和语言标准化之间发生了变化。 我猜前者比后者更有可能。
正如其他人指出的那样,该标准在一些情况下与 TC++PL 相矛盾,通常与术语有关。 Bjarne Stroustrup 本人很好地总结了这种情况:
(...)但是,[TC++PL] 不是参考手册或标准文本。 如果您需要 100% 准确和完整的信息,则必须查阅 ISO C++ 标准的文本。 (……)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.