[英]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.