2016-05-02 15 views
7

Ich bin gerade über die Art std::alignment_of Typ Merkmal und seine bald zu Freund std::alignment_of_v gestolpert. Sie scheinen speziell so entworfen worden zu sein, dass sie einem einfachen Aufruf an alignof entsprechen, und die zukünftige Hinzufügung des Helfers _v zeigt an, dass es nicht nur ein Legacy-Bit ist.`std :: alignment_of` versus` alignof`

Was ist die Verwendung von std::alignment_of (_v), wenn wir alignof haben?

+0

Um wahren Fehler zu haben, wenn Sie mit Ausdruck anstelle von verwenden * gnu-alignof-expression * :-). – Jarod42

Antwort

6

Sie sind fast vollständig redundant. Wie @Revolver bemerkt, wurden sie in verschiedenen Papieren vorgestellt, und alignment_of kommt von boost fast wörtlich.

Aber das bedeutet nicht, dass das Merkmal nutzlos ist.

Ein template<class...>class kann an andere template s übergeben und mit Metaprogrammierung verwendet werden. Operatoren wie alignof können nicht: Sie müssten die template<class>class alignment_of schreiben, bevor Sie sie an Metaprogrammierungseinrichtungen übergeben könnten.

Nun könnte das gleiche von sizeof, die eine std::size_of<class> Vorlage benötigen, gesagt werden.

...

Die Zugabe von _v war, weil sie jeder in std::valueintegral_constant -Typ Vorlage gefegt und hat eine _v variable Vorlage. Wenn man bedenkt, welche wo würdig und welche nicht bikeshed painting und fast sinnlos sind: es ist einfacher, jeden zu tun, als sich Mühe zu geben, die Würdigen zu erledigen. Es ist kein Beweis dafür, dass das Merkmal nicht obsolet ist.

+0

Die Nützlichkeit der Metafunktion selbst war mir nicht in den Sinn gekommen. Das ist ein sehr guter Punkt, danke! – Quentin

4

Die std::alignment_of wird als Port der Boost-Traits-Bibliothek eingeführt. Es ist älter als C++ 11 und alignof. Dieses Merkmal wurde durch den Operator alignof ersetzt, aber es wurde hauptsächlich aus Kompatibilitätsgründen beibehalten (Sie könnten einfach boost:: durch std:: ersetzen) und _v Variablenalias wird eingeführt, um Konsistenz mit anderen Teilen der Bibliothek zu gewährleisten.

+0

Aus Ihrer Antwort scheint es, als ob sie separat eingeführt wurden, als sie nicht waren (beide seit C++ 11). – edmz

+0

@black technisch wurden sie separat eingeführt (in verschiedenen Papieren). Der Punkt meiner Antwort war, dass es ein Teil der Pre-C++ 11-Bibliothek war, bevor es in den Standard aufgenommen wurde. –

+0

'alignment_of' war in TR1. –