首頁 >後端開發 >C++ >C 類別模板成員函數中的 ODR 使用是什麼?

C 類別模板成員函數中的 ODR 使用是什麼?

Linda Hamilton
Linda Hamilton原創
2024-12-06 11:44:11980瀏覽

What is ODR-Use in C   Class Template Member Functions?

理解C 中的ODR 使用

在C 程式設計環境中,討論類別時常會出現「odr 使用」的概念範本成員函數。

單一定義規則 (ODR) 確保每個實體都有一個一致的定義跨程式中的所有翻譯單元。 ODR-use 定義了實體何時必須提供定義,而不是簡單的聲明。

根據 C 標準,如果滿足以下條件,則非重載函數被 odr-use:

  • 它的名字出現在一個可能求值的表達式中。
  • 它是透過重載選擇的一組候選函數的成員
  • 它是一個非純虛函數。

ODR-使用和類別模板成員函數

用於類別模板成員函數,ODR 使用規則意味著它們只有在滿足條件時才會被實例化是:

  • 明確呼叫。
  • 虛擬且類別本身被實例化(即使未呼叫該函數)。

此規則確保範本成員函數僅在實際需要時才實例化。預設情況下,編譯器不會實例化未使用的成員函數,從而節省編譯時間。

ODR-使用和多個編譯單元

當使用多個編譯單元時,編譯器必須確保所有 ODR 使用的實體僅定義一次。它透過「主模板」的概念來實現這一點。主模板是翻譯單元中模板的第一個實例。其他翻譯單元中的所有後續範本實例化都被視為輔助實例化。

主範本負責提供 odr 使用的實體的定義。如果成員函數是 ODR 使用的,但未在主模板中調用,則仍必須使用定義來聲明它以滿足 ODR。

實例化所有成員函數

明確實例化類別模板可以保證所有成員函數的實例化,包括未調用的 odr 使用的函數。這確保了完整的定義可用於所有編譯單元,從而避免潛在的連結錯誤。然而,實例化未使用的成員函數並不總是必要或有效的。

以上是C 類別模板成員函數中的 ODR 使用是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn