2011-06-07 68 views
5

我厭倦了等待編譯器支持nullptrgcc 4.6 does,但它是如此新的幾個分佈支持它)。完美模擬nullptr

因此,作爲到nullptr完全支持的止損,我決定效仿它。有兩個仿真例子:一個來自here,另一個來自wikibooks

值得注意的是,兩種實現都沒有提到operator ==。但是,沒有一個,下面的代碼will not compile

int* ptr = nullptr; 
assert(ptr == nullptr); // error here: missing operator == 

這是operator ==錯誤的編譯器錯誤?
operator ==(和!=,<,<=等)需要更完美地模擬nullptr
仿真的nullptr和真正的交易有什麼不同?

+2

爲什麼你會這樣做而不是'assert(ptr);'首先呢? – ildjarn 2011-06-07 17:23:16

+0

@尼爾·巴特沃斯:事實並非如此。 'nullptr'必須是標準的一部分,因爲只有當每個人都使用相同的空指針類型'std :: nullptr_t'時,它才具有值。如果每個人都實現了自己的空指針,那麼如何編寫一個接受空指針的函數呢?你不知道什麼是空指針類型。 – Puppy 2011-06-07 17:28:08

+0

@ildjarn:我用一個斷言來清理代碼。我的實際例子是'std :: remove(v.begin(),v.end(),nullptr);'它使用了相等運算符。而我不會只使用'std :: remove_if'的原因是我不想。我希望它能像真正的'nullptr'一樣工作。 – 2011-06-07 17:41:29

回答

2

您使用C++ 0x編譯器對其進行編譯,該編譯器由於未知原因而失敗。它compiles fine in C++03

+0

所以,回到我原來的問題。這個錯誤是否是新的C++ 0x語言規則的影響?還是在添加其他C++ 0x功能時引入gcc的錯誤? – 2011-06-07 17:44:56

+2

@deft_code:1)您的代碼無效C++ 0x,因爲它使用關鍵字nullptr。 2)我90%確定這是一個GCC bug 3)已經有一個[類似的bug](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990)。 – ybungalobill 2011-06-07 17:45:55

+0

偉大的發現與該錯誤。我的[確切錯誤案例](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990#c4)在評論中列出。爲了迴應第1點,我必須說_no duh!_在完全兼容的C++ 0x編譯器中顯然是無效的。 gcc 4.5還沒有完全兼容,因此我需要模仿一個關鍵字。 – 2011-06-07 17:57:00

1

是的,你應該實現這樣的事情。然而,我感到驚訝的是,隱式轉換運算符並沒有踢進來,並且允許你在沒有提供明確運算符的情況下進行比較。

template<typename T> bool operator==(T* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
template<typename C, typename R> bool operator==(R C::* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
// And the reverse 
1

它實際上是在正式建議從你的第一個實例參考提到:

實驗與幾個流行 現有編譯表明它 產生差和/或誤導性 編譯器診斷爲幾個 第2節中描述的常見用例。(例子包括:「no const 從」const「轉換爲」int「」; 「沒有合適的轉換函數from」const類「到」int「 存在」; 「模板參數可能不會引用未命名的類型」; 「否 運算符」==「匹配這些操作數,操作數類型是:int == const類 」。)我們認爲編譯器仍然需要添加 nullptr的專門知識,以便爲 提供 的質量診斷常見用例。

所以如果編譯器還沒有,你應該自己填補這個空白。

+0

這個糟糕的編譯器診斷討論引用了一個未命名的'nullptr'類型。但是,標準委員會決定'nullptr'的類型爲'nullptr_t'。當'nullptr'類被命名爲'nullptr_t'時,所有這些隱含的錯誤消息都會變得更好。 – 2011-06-07 18:06:01

+0

@deft_code - 那麼問題是什麼呢? – littleadv 2011-06-07 18:13:04