Die C++ 03 CopyConstructible Anforderungen ausdrücklich die Forderung enthalten, dass die Adressoperator die tatsächliche Adresse des Objekts zurück, wie erwähnt in den Kommentaren 20,1 § .3 (Tabelle 30), daher könnten Typen, die diesen Operator überladen, Probleme mit der Standardbibliothek haben.
+------------+-------------+--------------------------+
| expression | return type | requirement |
+------------+-------------+--------------------------+
| T(t) | | t is equivalent to T(t) |
+------------+-------------+--------------------------+
| T(u) | | u is equivalent to T(u) |
+------------+-------------+--------------------------+
| t.~T() | | |
+------------+-------------+--------------------------+
| &t | T* | denotes the address of t |
+------------+-------------+--------------------------+
| &u | const T* | denotes the address of u |
+------------+-------------+--------------------------+
C++ 11 vereinfacht die Bewegung (und kopieren konstruierbar und zuweisbar Definitionen) auf eine weitere grundlegende Syntax;
T (rvalue); // move construct
T u = rvalue; // move assign
T (value); // copy construct
T u = value; // copy assign
Es macht keinen Hinweis auf die überladene Anschrift des Betreibers, sondern es auch wenig Erwähnung std::addressof
ausdrücklich erforderlich ist (außerhalb von einigen .resize()
Funktionen) machen. std::allocator
erfordert jedoch ausdrücklich, dass die Adresse der Typen auch bei Überlastung operator&()
korrekt ist.
Abschließend kann es wenig in der Spezifikation geben, die Verwendung von std::addressof()
zu fordern, aber angesichts der vereinfachten Anforderungen und expliziten Objektadressenanforderungen; die Verwendung von (oder ähnlich) ist sehr nahe daran, beauftragt zu werden.
Mein Take-Away hier ist; Wenn Sie einen generischen Code schreiben und die Adresse eines Objekts benötigen, verwenden Sie und bleiben Sie auf der sicheren Seite.
Welche "Anforderung" in C++ 03? Sind Sie sicher, dass es eine * Anforderung * und keine * Empfehlung * war? – Rapptz
Was ist falsch mit CComBSTR? –
@Rapptz, stimmt, ich bin mir nicht sicher, dass es als Voraussetzung beauftragt wurde, aber wenn über 'Operator &' überlastet, der Typ und die STL nicht gut "Bett Kerl". – Niall