Il C++ 03 CopyConstructible requisiti inclusi esplicitamente il requisito che l'operatore di indirizzo restituito l'indirizzo reale dell'oggetto, come indicato nelle osservazioni § 20.1 .3 (Tabella 30), quindi i tipi che hanno sovraccaricato quell'operatore potrebbero incontrare problemi con la libreria standard.
+------------+-------------+--------------------------+
| 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 semplifica il movimento (e copiare definizioni costruibili e assegnabili) ad una sintassi più semplice;
T (rvalue); // move construct
T u = rvalue; // move assign
T (value); // copy construct
T u = value; // copy assign
Non fa alcuna menzione dell'indirizzo sovraccarico dell'operatore, ma anche fare menzione di poco std::addressof
esplicitamente che sia necessario (fuori da alcune .resize()
funzioni). std::allocator
tuttavia richiede esplicitamente che l'indirizzo dei tipi sia corretto anche in presenza di sovraccarico operator&()
.
In conclusione, è possibile che ci sia poco nelle specifiche per richiedere l'uso di std::addressof()
ma alla luce dei requisiti semplificati e dei requisiti di indirizzo esplicito dell'oggetto; l'uso di std::addressof()
(o simile) è molto vicino al mandato.
Il mio take-away qui è; se stai scrivendo il codice generico e richiedi l'indirizzo di un oggetto, usa std::addressof()
e continua a stare dalla parte della sicurezza.
Quale "requisito" in C++ 03? Sei sicuro che fosse un * requisito * e non una * raccomandazione *? – Rapptz
Cosa c'è di sbagliato in CComBSTR? –
@Rapptz, vero, non sono sicuro che fosse obbligatorio come requisito, ma se sovraccarico su 'operatore &' il tipo e il STL non rendevano buoni "compagni di letto". – Niall