簡體   English   中英

C++ 特殊函數的隱式定義

[英]C++ implicit definition of special functions

在當前版本的 C++ 草案(2019 年 9 月)中, [class.default.ctor]/4段指出:

一個默認且未定義為已刪除的默認構造函數在它被 odr-used ([basic.def.odr]) 用於創建其 class 類型 ([intro.object]) 的 object 時被隱式定義,當需要它時常量求值 ([expr.const]),或者當它在第一次聲明后被顯式默認時。 [...]。 在隱式定義 class 的默認默認構造函數之前,其基類及其非靜態數據成員的所有非用戶提供的默認構造函數都應已隱式定義 [注意:隱式聲明的默認構造函數具有異常規范([except.spec])。 一個顯式默認的定義可能有一個隱式的異常規范,參見 [dcl.fct.def]。 ——尾注]

[class.dtor]/11為默認析構函數指定了類似的限制。

突出顯示的句子是什么意思? 是對程序的限制還是對實現(編譯器)的限制?

引用段落的第一句說明了默認默認構造函數何時被隱式定義(例如,當它被 odr-used 時)。 如果突出顯示的句子是對程序的限制,那么下面的例子應該是錯誤的,因為在 (1) 處B的默認默認構造函數是 odr-used,因此它是隱式定義的。 但是,此時A的默認默認構造函數尚未隱式定義,因此不遵守突出顯示的句子中的限制。 這是因為我相信A的默認默認構造函數僅在定義B的默認默認構造函數后才被使用。 這個假設錯了嗎?

struct A {};
struct B : A {};

int main()
{
    B b; // (1)
}

謝謝你。

我同意 OP 的觀點,即起草草率,但我相信意圖很明確:

  • 當實現隱式定義B的默認構造函數時,如果A的默認構造函數尚未在該翻譯單元中隱式定義,則編譯器應首先生成A的默認構造函數的隱式定義。
  • 為了回應 OP 的擔憂,即這會產生一個可能生成隱式定義的附加點(除了引用段落第一句中所述的內容),當然,這是一種可能的解釋方式。 另一種解釋它的方法是,編譯器在定義B的默認構造函數的過程中開始定義A的默認構造函數(因為B的默認構造函數調用A的默認構造函數“以創建其 class 類型的 object ",因此需要隱式定義A的默認構造函數)並且前者必須在后者之前完成。 換句話說,引用段落的第一句是指隱式定義的生成何時開始,加粗的句子是指何時完成。 我認為這兩種解釋是等價的,所以沒有必要在它們之間進行選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM