因此,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. Ruby中的一元加运算符有什么意义?
- 9. 是否有任何算法来判断一个字符串是否有意义
- 10. 如何超载运算符+
- 11. 超载运算符输出
- 12. 运算符*超载C++
- 13. C++超载运算符
- 14. 类运算符*超载
- 15. 运算符+超载C++
- 16. 赋值=运算符超载
- 17. 链接超载+运算符
- 18. 结构运算符超载
- 19. 运算符超载怀疑
- 20. @运算符的意义是什么?
- 21. MASM是否有::运算符?
- 22. 是否有三元运算符不是某种形式的条件运算符
- 23. 飞镖是否支持运算符超载
- 24. 重载运算符<< - 必须是二元运算符
- 25. Python是否有像Perl一样的定义或运算符?
- 26. 是否有可能超载“?”运营商?
- 27. 是否dwscript支持运算符重载
- 28. Java是否支持运算符重载?
- 29. 有关在运算符重载定义
- 30. 重载一元运算符的后缀
@Johannes:谢谢!我从来不知道谷歌代码搜索。这是一个遗憾,我不能接受评论作为答案:) – 2010-10-16 13:43:37