2014-09-25 102 views
-3

這是C和C++之間邊界層上的一行函數。該函數獲得一堆void* 並將它們轉換爲它們應該的類型。發現錯誤:爲什麼我能夠默認構造一個沒有默認構造函數的對象?

MDLPeriph periph_dline = *static_cast<MDLPeriph*>(dline_periph); 

確實,periph_dline應該是一個參考。令我感到困惑的是這段代碼編譯時沒有警告。此外,檢查此代碼時,gdb報告Internal GDB error.並崩潰。

據我所知,上面的代碼默認構造一個MDLPeriph對象。然後是使用新對象的拷貝構造函數從右側分配值。

但MDLPeriph沒有默認的構造函數!這怎麼可能?

平臺和工具:

Windown 7
yagarto的此版本使用以下版本:

的binutils:2.23.1 GCC:4.7.2 newlib:1.20.0 GDB:7.5。 1

(2012年12月22日,MIFI)OpenOCD的o.7.0

+2

這是一個直接複製結構。沒有默認的建設。 @Andreas不,類可以沒有默認的構造函數。只有當類沒有任何用戶聲明的構造函數時,才默認構造函數被隱式聲明。 – 2014-09-25 13:40:09

+2

@Andreas:不,一個類不一定有默認的構造函數。例如查看您鏈接到的問題的答案。 – sth 2014-09-25 13:42:20

+0

哦,該死的,是的,錯過了當有**任何其他構造函數可用時,將不會生成默認構造函數...... – 2014-09-25 13:44:53

回答

5

沒有什麼在這裏被默認構造。

指針強制轉換會導致任何dline_periph指向被解釋爲MDLPeriph對象,而不會創建新對象;然後用它複製 - 使用它的拷貝構造函數初始化periph_dline

+0

因此,一個新對象仍在構建中,但其成員的任務是在施工? – Vorac 2014-09-25 14:25:38

+0

@Vorac:'periph_dline'是一個新的對象,使用它的拷貝構造函數初始化(除非它被定義爲做一些奇怪的事情,它會複製每個成員的初始化)。 – 2014-09-25 14:38:06