在C++的空對象上進行函數調用時返回的布爾值是什麼?對函數調用返回的空值對象的布爾值
ClassDummy* dummy = NULL;
if (!dummy->dummy_function(1,2,3)) {
// Do Something
}
不應該根據C++ 11標準返回錯誤嗎?
在C++的空對象上進行函數調用時返回的布爾值是什麼?對函數調用返回的空值對象的布爾值
ClassDummy* dummy = NULL;
if (!dummy->dummy_function(1,2,3)) {
// Do Something
}
不應該根據C++ 11標準返回錯誤嗎?
通過空指針調用方法具有未定義的行爲。該代碼無效,但編譯器不需要告訴你它是。
C++標準定義了許多情況,即使代碼無效,編譯器也不需要提供「診斷」。在很多情況下,原因僅僅是因爲編譯器很難確定代碼是否有效。在你的特定代碼中,這很容易,如果你使用適當的警告級別,一些編譯器實際上可能會給出警告。但是,構造一個更復雜的示例並不會太困難,因爲編譯器不會輕易分辨指針是否爲空。在編譯器不需要進行診斷之前,將代碼標準化非常複雜將很困難,而且可能毫無意義,因此每個實現都需要做出決定。
除非dummy
已在名稱空間範圍內聲明,否則它未初始化並且其值未指定,即它可能是或不是null。調用nullptr
或指向無效內存的指針上的成員函數是未定義的行爲。
如果您調用的成員函數不訪問該類的任何其他數據成員,則可能是get away with the correct result;換句話說,如果它不取消對this
指針的引用。但是,無論您是否獲得預期的結果,它仍然是未定義的行爲。
編譯器不需要檢測這種無效的函數調用。如果你做了一些明顯的事情,比如初始化一個對象指針到nullptr
,然後調用它的成員函數,你可能會看到來自編譯器的診斷,但這不能保證。
試圖取消引用這樣的空指針將導致未定義的行爲。
(典型地,在大多數系統核心轉儲或存儲器存取的異常。)
而且,如果調用不訪問'* this'的非虛擬成員函數,通常會靜靜地顯示工作。 – hvd
@ hvd無論如何,這是邪惡的。 – songyuanyao
調用非靜態成員函數和訪問非靜態成員變量應該產生錯誤。
某些編譯器和運行時環境允許使用帶有NULL指針的static
成員變量和成員函數,但根據標準,這仍然是未定義的行爲。
有關更多詳細信息,請參閱C++ static const access through a NULL pointer和接受的答案。
爲了回答你所有的未來「不應該C++告訴我我做錯了什麼」事先提問:不。對於程序運行的情況,C++會進行大量優化,代價是幾乎沒有任何關於有bug的情況。 – user2357112