簡體   English   中英

使用 nullptr 作為 std::unordered_map 的鍵有什么后果嗎?

[英]Are there any consequences in using a nullptr as a key for std::unordered_map?

在執行someMap.insert(make_pair(nullptr, nullptr))是否有任何副作用/問題? 不包括取消引用空指針的危險。

someMap.insert(make_pair(nullptr, nullptr))沒有違規 但是你需要注意在使用這個元素時不要取消nullptr引用,否則你的程序會有未定義的行為(並且可能會觸發 Segmentation Fault)。

注意:顯然映射需要在鍵中有一個指針,在值中有一個指針,否則表達式會導致編譯錯誤,或者在最壞的情況下會導致未定義行為。

這可以。

空指針是要持有的指針的有效值。 你可以用它做任何你可以用任何其他有效指針做的事情(除了取消引用它)。

請確保您的指針有效。 如果不是,僅對它們求值就具有未定義的行為(自 C++17 以來實現定義的行為)。 但是評估一個空指針很好,因為它不是“無效”,只是無法引用。

這的有效性完全取決於someMap到底是什么。

讓我們假設someMap有一個鍵類型,它是一個實際的指針(也就是說,不是類似指針的類型,而是某種類型的T* )。

那么問題就變成了比較兩個指針如果其中一個是nullptr的有效性。 這意味着要問……地圖如何比較其鍵類型?

std::map的鍵比較是可配置的。 默認情況下,它使用std::less<Key>

這很重要,因為使用<或其他任何東西的指針的正常排序比較只會在指針值之間強加偏序 可以比較同一數組中的指針,以及指向同一對象中子對象的指針(按聲明排序,對於標准布局類型)。 因此,空指針和除另一個空指針以外的任何指針值之間的順序比較是不允許的。

對你來說幸運的是, std::less對指針進行了專門化,它對所有指針值強加了一個總順序 相比之下,定義了所有指針的總順序。

但是,如果您提供了一種不同的比較類型,一種基於調用<而不是std::less比較類型,那么您不能將nullptr插入到這樣的map

如果鍵類型是某種類似指針的類型,一種基於指針的值進行比較的類型,那么最好使用std::less而不是< ,否則您會遇到麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM