為什么下面的代碼會編譯?
class Demo
{
public:
Demo() : a(this->a){}
int& a;
};
int main()
{
Demo d;
}
在這種情況下,a是對整數的參考。但是,當我初始化 Demo 時,我傳遞了一個對尚未初始化的整數的參考的參考。為什么要編譯?
即使int我使用對具有私有默認建構式的類的參考代替 ,這仍然可以編譯。為什么這是允許的?
uj5u.com熱心網友回復:
為什么要編譯?
因為它在語法上是有效的。
C 不是一種安全的編程語言。有幾個功能可以讓做正確的事情變得容易,但防止某人做錯事并不是當務之急。如果你決心做一些愚蠢的事情,沒有什么能阻止你。只要你遵循語法,你可以嘗試做任何你想做的事情,不管語意多么可笑。請記住:編譯是關于語法,而不是語意。*
話雖如此,撰寫編譯器的人并非沒有同情心。他們知道常見的錯誤(可能來自個人經驗),并且他們認識到您的編譯器可以很好地發現某些型別的語意錯誤。因此,當您執行某些沒有意義的事情(不是所有事情)時,大多數編譯器都會發出警告。這就是為什么您應該始終啟用編譯器警告。
警告不會捕獲所有邏輯錯誤,但對于它們捕獲的錯誤(例如warning: 'Demo::a' is initialized with itself和warning: '*this.Demo::a' is used uninitialized),您已經為自己節省了大量除錯時間。
* 好的,編譯涉及一些語意,例如賦予識別符號含義。當我說編譯與語意無關時,我指的是更高級別的語意,例如預期的行為。
uj5u.com熱心網友回復:
為什么要編譯?
因為沒有任何規則會使程式格式錯誤。
為什么這是允許的?
需要明確的是,該程式格式良好,因此可以編譯。但是程式的行為是未定義的,所以從這個角度來看,你的問題的前提是有缺陷的。這是不允許的。
不可能證明所有使用不確定值的情況,也不容易指定編譯器應該檢測哪些簡單情況,哪些會被認為太困難。因此,標準不會嘗試指定它,而是讓編譯器在能夠檢測到它時發出警告。例如,就其價值而言,GCC 能夠在這種情況下檢測到它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373608.html
標籤:C
上一篇:錯誤未定義的參考類::函式
下一篇:采用模板化長度引數的函式
