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...