2010-10-16 54 views
4

因此,C++允许超载一元operator &(地址)。你知道任何真实世界例如当operator &被正确地重载吗?第二个更具体的问题是,您知道任何真实世界例如当operator &正确地重载,同时保留地址语义? TIA它是否有意义超载一元运算符&?

+0

@Johannes:谢谢!我从来不知道谷歌代码搜索。这是一个遗憾,我不能接受评论作为答案:) – 2010-10-16 13:43:37

回答

5

我有207 真实世界operator &()例子:Code search 1Code search 2

包括SafeInt<>(以获得潜在的裸体整数),boost::gil(显然也得到原始数据),Mozilla的(即说:“这是有风险的定义运营商&,但是,嘿,我们知道我们在做什么。“),wxWidgets,Armagetron以及更多。

似乎有些人使用迭代器成语&*it来获得一个原始参考或指针向后,并写*&it得到一个原始参考和&it得到一个原始指针。

请注意,一旦您的类型重载operator&并返回与内置运算符不同的内容,您的类型不再是CopyConstructible(在C++ 03 - C++ 0x似乎已解除​​它),因此不能用作标准容器中的元素类型。

1

我不知道一个具体的例子,但我可以想象一个容器类,你可能想要返回一个智能指针或迭代器。不过,我并不是说这一定是有道理的。

+0

我的问题是 - 特别是关于现实世界的例子 – 2010-10-16 11:23:24

+0

你是对的奥利。智能指针是必须像指针一样工作的类,因此需要运算符*甚至重载。砰一声。 – 2010-10-16 11:28:27

+2

@Samrat:究竟是什么过载和智能指针给你?! – 2010-10-16 11:31:21

1

一个很好的理由超载可能是使它private,以防止用户使用它。我不能想到任何你想要防止这种情况的真实世界的例子,但它似乎是超载它的最合乎逻辑的理由。

0

在编写用于与Direct3D交互的类时,我重载了此运算符。这是一个智能指针类,需要从运算符&返回T **,以便它可以用于期望指针指向的函数中。 T **语义很少见,但在某些情况下您确实需要它们。

1

当对象有一个特殊用途的智能指针时,我做了一次。 operator&悄悄地将堆栈分配的对象“提升”为基于堆栈的智能指针版本,并且一旦对象位于指针内,此运算符的行为就会有所不同。

我没有代码了,但当时的一个原因。这当然不是一个轻松的决定,这条路上布满了尸体。

+1

+1可怕的警告 – KitsuneYMG 2010-10-16 15:06:00