2013-06-27 22 views
5

UPDATE2編譯器警告的:缺乏與不正確初始化梅開二度

由於懷疑,這並不一定與具有初始化列表構造做。從R.費爾南德斯Martinho的評論很明顯,它只是試圖構造一個對象與自身的副本使用大括號語法時未檢測:

struct C{ 
    C(){} 
}; 
struct D{ 
    C c0{c0}; // << -- compiles without warning 
    C c1(c1); // << -- does not compile 
}; 

的問題依然存在。本案例的標準是否需要診斷?我意識到診斷對於各種錯誤是不可能的或不切實際的。

我結束了這個報告,因爲錯誤57758

原題:

我認識好管理編寫錯誤代碼(由純打錯),最終產生的寄生bad_alloc例外。我不知道是否有一個很好的理由gcc(4.7.2和4.8.1)不警告這一點。

是一個診斷要求,這種情況下的標準呢?我意識到診斷對於各種錯誤是不可能的或不切實際的。

這就是它歸結爲:

#include <initializer_list> 
struct A{}; 
struct C{ 
    C(std::initializer_list<A*> as){} 
}; 
struct D{ 
    C c{c}; // <<- well... 
};  
int main(){ 
    D d; 
} 

編輯:我提initializer_list的原因是,如果我刪除了初始化列表構造我得到一個錯誤:error: too many initializers for ‘C’

我認爲這是造成的,由於沒有用戶定義(用戶聲明?)構造函數,我得到骨料初始化,這是不行的,因爲在C.沒有成員(C型)的事實

+1

什麼是initializer_lists的關係?這只是來自未初始化變量的副本。 –

+0

c {c}是什麼意思? –

+0

由於c不是'A *',它意味着一個副本。 –

回答

1

鏘++具有相同的行爲。當未初始化時,您將c0的值傳遞給默認拷貝構造函數,但未收到「此處未初始化時使用」警告。 (寫私人拷貝構造函數進行確認。)

我認爲正在發生的事情是direct-list-initialization。我不知道標準是否需要診斷,但值得提交一份有關錯誤報告。