2010-10-16 55 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