2016-05-02 11 views
7

Mi sono appena imbattuto nel tratto di tipo std::alignment_of e nel suo prossimo amico std::alignment_of_v. Sembra che siano stati specificamente progettati per essere equivalenti a una semplice chiamata a alignof e la futura aggiunta dell'helper _v indica che non è solo un bit legacy.`std :: alignment_of` versus` alignof`

A cosa serve std::alignment_of (_v), quando abbiamo alignof?

+0

Per avere un vero errore quando si usa con expression invece di usare * gnu-alignof-expression * :-). – Jarod42

risposta

6

Sono quasi completamente ridondanti. Come notato da @Revolver, sono stati introdotti in diversi tipi di documenti e lo standard alignment_of deriva da boost quasi alla lettera.

Ma questo non significa che il tratto sia inutile.

Un template<class...>class può essere passato ad altri template se utilizzato con metaprogrammazione. Operatori come alignof non possono: si dovrebbe scrivere lo template<class>class alignment_of prima di poterlo passare alle funzioni di metaprogrammazione.

Ora lo stesso si può dire di sizeof che richiede un modello std::size_of<class>.

...

L'aggiunta di _v era perché spazzati ogni template::valueintegral_constant tipo in std e ha aggiunto un modello variabile _v. Considerando quali sono degni e quali non sarebbero la pittura su un bikehed e quasi inutili: è più facile fare ognuno che spendere gli sforzi per scegliere quelli degni da fare. Non è stato dimostrato che la funzionalità non sia obsoleta.

+0

L'utilità della metafunzione stessa non mi era passata per la testa. Questo è un ottimo punto, grazie! – Quentin

4

Il std::alignment_of viene introdotto come porta della libreria di tratti di tipo Boost. Precede la parola chiave C++ 11 e alignof. Quel tratto è stato sostituito dall'operatore alignof, ma è stato mantenuto principalmente per scopi di compatibilità (in modo da poter sostituire semplicemente boost:: con std::) e l'alias variabile _v viene introdotto per coerenza con altre parti della libreria.

+0

Dalla tua risposta sembra che siano stati introdotti separatamente, quando non lo erano (entrambi dal C++ 11). – edmz

+0

@black tecnicamente sono stati introdotti separatamente (in documenti diversi). Il punto della mia risposta era che faceva parte della libreria pre-C++ 11 prima di essere inclusa nello standard. –

+0

'alignment_of' era in TR1. –