Was ist der Unterschied zwischen 'typedef' und 'using' in C ++ 11?
Ich weiß, dass in C++11 können wir nun verwenden using
zu schreiben, geben Sie den alias, wie typedef
s:
typedef int MyInt;
Ist, von dem, was ich verstehe, ist das äquivalent zu:
using MyInt = int;
Wird und neue syntax entstand aus dem bemühen, einen Weg zu expresstemplate typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Aber, mit den ersten zwei nicht-template-Beispiele, gibt es andere subtile Unterschiede in der Norm? Zum Beispiel typedef
s tun aliasing, die in eine "schwache" Art und Weise. Das es ist keine neue type, sondern nur einen neuen Namen (sind implizite Konvertierungen zwischen diesen Namen).
Ist es das gleiche mit using
oder tut, erzeugt es ein neues geben? Gibt es irgendwelche Unterschiede?
Kommentar zu dem Problem
Ich persönlich bevorzuge die neue syntax, denn es ist viel mehr ähnlich wie normale Variablen-Zuordnung, was die Lesbarkeit verbessert. Zum Beispiel, bevorzugen Sie
typedef void (&MyFunc)(int,int);
oder mit MyFunc = void(int,int);
? Ich Stimme voll und ganz, ich habe nur die neue syntax verwenden jetzt. Das ist, warum ich fragte, um sicher zu sein, gibt es wirklich keinen Unterschied.
@MatthieuM. diese beiden sind Verschieden btw. Es sollte
typedef void MyFunc(int,int);
(die eigentlich nicht so schlecht), oder mit MyFunc = void(&)(int,int);
@R. MartinhoFernandes warum brauchen Sie (&) in
mit MyFunc = void(&)(int,int);
? bedeutet es MyFunc
ist eine Referenz auf eine Funktion? was ist, wenn du weglassen, die &? Ja, es ist eine Funktionsreferenz. Es ist äquivalent zu
typedef void (&MyFunc)(int,int);
. Wenn du weglassen, die &
ist äquivalent zu typedef void MyFunc(int,int);
InformationsquelleAutor der Frage Klaim | 2012-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie gleichwertig sind, von der standard - (Hervorhebung von mir) (7.1.3.2):
InformationsquelleAutor der Antwort Jesse Good
Den mit syntax hat den Vorteil, wenn verwendet, innerhalb von Vorlagen. Wenn Sie die Art der Abstraktion, sondern auch halten müssen-template-parameter können angegeben werden, in Zukunft. Sollten Sie so etwas schreiben.
Aber mit syntax vereinfacht diesen Anwendungsfall.
InformationsquelleAutor der Antwort 4xy
Sind Sie weitgehend identisch, außer dass
The alias declaration is compatible with templates, whereas the C style typedef is not.
InformationsquelleAutor der Antwort Zhongming Qu
Sind Sie im wesentlichen das gleiche, aber
using
bietetalias templates
die sehr nützlich ist. Ein gutes Beispiel, das ich finden konnte, ist wie folgt:So, wir können
std::add_const_t<T>
statttypename std::add_const<T>::type
InformationsquelleAutor der Antwort Validus Oculus