因此,C++允許超載一元operator &
(地址)。你知道任何真實世界例如當operator &
被正確地重載嗎?第二個更具體的問題是,您知道任何真實世界例如當operator &
正確地重載,同時保留地址語義? TIA它是否有意義超載一元運算符&?
回答
我有207 真實世界的operator &()
例子:Code search 1,Code search 2。
包括SafeInt<>
(以獲得潛在的裸體整數),boost::gil(顯然也得到原始數據),Mozilla的(即說:「這是有風險的定義運營商&,但是,嘿,我們知道我們在做什麼。「),wxWidgets,Armagetron以及更多。
似乎有些人使用迭代器成語&*it
來獲得一個原始參考或指針向後,並寫*&it
得到一個原始參考和&it
得到一個原始指針。
請注意,一旦您的類型重載operator&
並返回與內置運算符不同的內容,您的類型不再是CopyConstructible(在C++ 03 - C++ 0x似乎已解除它),因此不能用作標準容器中的元素類型。
我不知道一個具體的例子,但我可以想象一個容器類,你可能想要返回一個智能指針或迭代器。不過,我並不是說這一定是有道理的。
我的問題是 - 特別是關於現實世界的例子 – 2010-10-16 11:23:24
你是對的奧利。智能指針是必須像指針一樣工作的類,因此需要運算符*甚至重載。砰一聲。 – 2010-10-16 11:28:27
@Samrat:究竟是什麼過載和智能指針給你?! – 2010-10-16 11:31:21
它出現在ATL使用,e.g http://msdn.microsoft.com/en-us/library/5s6et3yb.aspx
感謝,這正是我一直在尋找 – 2010-10-16 11:33:50
一個很好的理由超載可能是使它private
,以防止用戶使用它。我不能想到任何你想要防止這種情況的真實世界的例子,但它似乎是超載它的最合乎邏輯的理由。
在編寫用於與Direct3D交互的類時,我重載了此運算符。這是一個智能指針類,需要從運算符&返回T **,以便它可以用於期望指針指向的函數中。 T **語義很少見,但在某些情況下您確實需要它們。
當對象有一個特殊用途的智能指針時,我做了一次。 operator&
悄悄地將堆棧分配的對象「提升」爲基於堆棧的智能指針版本,並且一旦對象位於指針內,此運算符的行爲就會有所不同。
我沒有代碼了,但是當時的一個原因。這當然不是一個輕鬆的決定,這條路上佈滿了屍體。
+1可怕的警告 – KitsuneYMG 2010-10-16 15:06:00
- 1. C++ *運算符是否「已經超載?」
- 2. 如何超載一元/運算符?
- 3. 運算符超載[]
- 4. 運算符超載
- 5. 運算符==超載
- 6. 運算符+超載
- 7. 運算符超載
- 8. 運算符超載
- 9. 超載一元運算符的合法原因是什麼?
- 10. 運算符超載賦值運算符
- 11. 元運算符在C++超載特例
- 12. matlab是否有三元運算符?
- 13. Ruby中的一元加運算符有什麼意義?
- 14. 是否有任何算法來判斷一個字符串是否有意義
- 15. 運算符*超載C++
- 16. 鏈接超載+運算符
- 17. 運算符+超載C++
- 18. 未能超載運算符+ =
- 19. 結構運算符超載
- 20. 類運算符*超載
- 21. 如何超載運算符+
- 22. 賦值=運算符超載
- 23. Qt超載運算符
- 24. C++超載運算符[]
- 25. Python 3運算符超載
- 26. C++超載運算符
- 27. 運算符+超載問題
- 28. 運算符超載:Ostream/Istream
- 29. 超載運算符輸出
- 30. 運算符超載懷疑
@Johannes:謝謝!我從來不知道谷歌代碼搜索。這是一個遺憾,我不能接受評論作爲答案:) – 2010-10-16 13:43:37