2017-09-25 91 views
3

爲了我的理解,五規則是一個引導規則。儘管如此,我已經看到編譯器在某些情況下可能會隱式地刪除函數。例如,定義移動對象時,複製指定/複製對象將被刪除。五規則和隱式刪除函數

我想知道是否有更多的情況下提到。換句話說,用戶定義的函數在哪些場景中可以隱式地刪除其他函數?

感謝

編輯:
到覆蓋的主題將是沒關係的一些源的參考!

+0

有隻有三個始終宣稱的特殊成員,隱含因此,如果沒有用戶聲明:拷貝構造函數,拷貝賦值和析構函數。如果操作不可用,它們的每個隱含聲明都可能是聲明爲刪除的聲明。 –

+0

所有這些都在[「特殊成員函數」](https://timsong-cpp.github.io/cppwp/n4659/special)下由C++標準覆蓋。只需在該部分查找「已刪除」一詞即可。 – StoryTeller

+1

這裏有一個關於這個地方的nixe矩陣(可能是某個會議上談話的一部分),但是對於上帝的愛我無法找到它。 – MikeMB

回答

1

對於所有的「五」,該標準定義了它們將被隱式聲明爲刪除的情況。我已命名並從C++標準N4659援引的相關章節您:

  • (12.3.3)當定義一個工會,有的五個可以被隱式刪除:

    [..] [注意:缺少默認成員 初始值設定項(12.2),如果聯合的任何非靜態數據成員都有一個非平凡的默認構造函數(15.1),則複製 構造函數(15.8),移動構造函數(15.8),複製賦值運算符15.8),移動賦值運算符(15.8), 或析構函數(15.4),工會的相應成員函數必須由用戶提供,或者將爲 隱含刪除(11.4.3)的工會 - 注完]

  • (15.1) 「十二五」 是隱式聲明的時候沒有用戶自定義選擇:

    默認構造函數(15.1) ,複製構造函數和複製賦值運算符(15.8),移動構造函數 和移動賦值運算符(15.8)和析構函數(15.4)都是 特殊成員函數 。 [ 注意: 當程序不 明確聲明它們爲時, 實現將隱式聲明這些成員函數的某些類類型。如果它們是odr-used的(6.2),實現將隱含地定義它們。見15.1, 15.4和15.8。 - 注完 ]

  • (15.1.1)的構造的隱式刪除:

    甲默認爲刪除爲X類默認的構造被定義,如果:
    - (5.1)X是一個具有不平凡默認構造函數的變體成員並且沒有X的變體成員具有默認成員初始化程序的聯合,
    - (5.2)X是一個非聯合類,具有變體成員M並且具有非平凡的默認值構造函數並且沒有包含M的匿名聯合的變體成員具有默認成員初始值設定項(5.3)任何沒有默認成員初始值設定項(12.2)的非靜態數據成員都是參考類型的,
    - (5。4)不帶括號或等同初始值設定項的const限定類型(或其數組)的任何非變體非靜態數據成員不具有用戶提供的默認構造函數,(5.5)X是聯合和其所有變體成員都是const限定類型(或其數組),
    - (5.6)X是非聯合類,任何匿名聯合成員的所有成員都是const限定類型(或其數組) (5.7)任何可能構造的子對象,除了帶有括號或等於初始值設定項的非靜態數據成員,都具有類型M(或其數組),並且M沒有默認構造函數或重載解析(適用於查找M的相應構造函數結果的模糊性或在從默認構造函數中刪除或無法訪問的函數中,或者
    - (5.8)的任何潛在的構造子對象具有與從所述默認的默認的構造

  • (15.8.1.10)隱缺失複製/移動的構造刪除或不可接入的析構型:

    如果X具有:
    - (10.1)具有非平凡對應構造函數的變體成員,並且X是類聯合類,
    (10.2)潛在構造的子對象類型M(或其數組),其因爲overloop而不能被複制/移動適用於查找M的相應構造函數的廣告解決方案(16.3)導致從默認構造函數中刪除或無法訪問的模糊或函數, - (10.3)具有析構函數的任何可能構造的子對象,從默認的構造函數中刪除或不可訪問,或者 - 對於拷貝構造函數,rvalue引用類型的非靜態數據成員,(10.4)。定義爲刪除的默認移動構造函數被重載解析(16.3,16.4)忽略。 [注意:刪除的移動構造函數會影響可以使用複製構造函數的右值的初始化。 - 注完]

  • (15.8.2)複製/移動賦值運算符的隱式刪除:

    爲已刪除如果X具有用於類X A拖欠複製/移動賦值運算符被定義:
    - (7.1)具有非平凡對應賦值運算符的變體成員,並且X是類似聯合體的類,或(7.2)const非類類型(或其陣列)的非靜態數據成員,或
    (7.3)參考類型的非靜態數據成員,或者(7.4)直接n類型M(或其數組)的靜態數據成員或不能複製/移動的直接基類M,因爲應用於查找M的相應賦值運算符的重載解析(16.3)會導致模糊或從默認賦值運算符中刪除或無法訪問的函數。

  • (15.4.5)的析構函數的隱式刪除:

    爲刪除的一類X A拖欠析構函數被定義,如果:
    - (5.1)X是聯合狀類,它具有(5.2)任何可能構造的子對象具有類類型M(或其數組),並且M具有從默認析構函數不可訪問的已刪除的析構函數或析構函數,(- - 5。3),或者對於虛擬析構函數,查找非數組解除分配函數會導致模糊或導致從默認析構函數中刪除或無法訪問的函數。

+0

非常感謝! – Elimination