c 類的某個成員的析構函式是刪除的,會導致類合成的預設建構函式也是刪除的?

時間 2021-06-03 14:56:47

1樓:電影旅行敲程式碼

我補充一點,C++標準 > 12.1-Constructor中(4.7)小節描述如下:

A defaulted default constructor for class X is defined as deleted if:

(4.7) — any potentially constructed subobject has a type with a destructor that is deleted or inaccessible from the defaulted default constructor.

C++標準給出了具體的描述,但是沒有給出原因。

題主點明建構函式在異常處理場景下需要呼叫資料成員A的析構函式A::~A(),例如建構函式中有new operator呼叫等情況確實有可能出現異常。但是如果使用C++11中的noexcept修飾B::

B(),明確告知編譯器保證B::B()不會丟擲異常,此時B::B()的確不會呼叫A::

~A(),見https://

godbolt.org/g/BrcOhP

。雖然noexcept修飾的B::B()不會呼叫A::~A(),但是"~A() = delete;"編譯還是不會通過,見https://

godbolt.org/g/tdg2p0

。那是否表明編譯器對B::B()進行語義分析的時候,是無腦按照C++標準12.

1-Constructor (4.7)執行的,無論B::B()是否存在呼叫A::

~A()的需要?

C 的建構函式與析構函式?

關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...

C 如何將成員函式指標作為普通函式的引數傳遞?

BinGostar 將bar函式改為如下 void bar test pp tkzzz 可以定義乙個函式指標第乙個引數是void 然後傳遞的時候第乙個引數就是類位址因為在cpp裡面類成員函式的呼叫就是第乙個引數是類位址 具體如下 include template F void f2a F f fun...

c 類的建構函式初始化問題??

Right If you don t specify any constructors,the compiler will write one for you that doesn t take any arguments.This compiler generated default constr...