2007年7月12日 星期四

const 物件的初始化

昨天(2006/9/25, 這篇是搬過來的舊文) Orson 跟我抱怨,說某人 break build 的責任該算在我頭上,因為上星期我的教學課程叫大家多用 const, 可是某人用了 const 造成 g++ compile 不過.

trace 了一下發現他宣告了一個 const 物件而沒有初始化它,VC(不管VC6或VC8都一樣)卻只吐個 warning C4269 而已(跟我想的不一樣),而 g++ 則是出現 compile error.

今天早上來公司後,想到這件事,就決定查查看 SPEC 怎麼寫的。查了好一陣子,終於找到了:


If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a nonstatic object, the object and its subobjects, if any, have an indeterminate initial value; if the object or any of its subobjects are of const-qualified type, the program is ill-formed.

節錄自 C++ SPEC section 8.5, 第 9 款。簡單的說,若你宣告了一個物件,而且沒有對它初始化:

   非POD物件 POD物件
非const物件 呼叫default constructor 未始初化,其值未定義
const物件 呼叫default constructor 不合法(ill-formed)

結論:g++ 正確,VC 錯誤(它呼叫 default constructor, 但宣告的是 const POD 物件).

名詞解釋: POD - Plain Old Data.

註:這篇是從 Yahoo Blog 搬過來的,原發文時間為 2006/09/26 12:44。


沒有留言: