Wiem, że w C ++ 11 możemy teraz używać using
do pisania aliasu typu, takiego jak typedef
s:
typedef int MyInt;
Z tego, co rozumiem, jest równoważne z:
using MyInt = int;
Ta nowa składnia powstała w wyniku wysiłku, aby wyrazić „ template typedef
”:
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Ale czy w przypadku dwóch pierwszych przykładów innych niż szablony istnieją inne subtelne różnice w standardzie? Na przykład typedef
aliasing w „słaby” sposób. Oznacza to, że nie tworzy nowego typu, a jedynie nową nazwę (konwersje są niejawne między tymi nazwami).
Czy jest tak samo z using
czy generuje nowy typ? Czy są jakieś różnice?
c++
c++11
typedef
using-declaration
Klaim
źródło
źródło
typedef void (&MyFunc)(int,int);
czyusing MyFunc = void(int,int);
?typedef void MyFunc(int,int);
(co tak naprawdę nie wygląda tak źle), lubusing MyFunc = void(&)(int,int);
using MyFunc = void(&)(int,int);
? czy to znaczy, żeMyFunc
jest odwołaniem do funkcji? co jeśli pominiesz & ?typedef void (&MyFunc)(int,int);
. Jeśli pominiesz, jest&
to odpowiedniktypedef void MyFunc(int,int);
Odpowiedzi:
Są one równoważne ze standardowego (moje wyróżnienie) (7.1.3.2):
źródło
using
słowo kluczowe wydaje się nadzbioremtypedef
. Czytypdef
w przyszłości będą przestarzałe?using
składnię właśnie dlatego, żetypedef
semantyka nie działała dobrze z szablonami. Co w jakiś sposób przeczy temu, żeusing
zdefiniowano, że ma dokładnie taką samą semantykę.n1489
. Alias szablonu nie jest aliasem typu, ale aliasem grupy szablonów. Aby dokonać rozróżnienia międzytypedef
odczuwaną potrzebą nowej składni. Pamiętaj również, że pytanie OP dotyczy różnicy między wersjami nieszablonowymi.typdef
był przestarzały.Są w dużej mierze takie same, z wyjątkiem tego, że:
źródło
typedef
jeśli mogę zapytać?Użyciem składni ma przewagę, gdy używane w szablonach. Jeśli potrzebujesz abstrakcji typu, ale musisz także zachować parametr szablonu, aby można go było określić w przyszłości. Powinieneś napisać coś takiego.
Ale użycie składni upraszcza ten przypadek użycia.
źródło
Są zasadniczo takie same, ale
using
zapewniaalias templates
co jest całkiem przydatne. Dobry przykład, jaki mogłem znaleźć, to:Możemy więc użyć
std::add_const_t<T>
zamiasttypename std::add_const<T>::type
źródło
Wiem, że oryginalny plakat ma świetną odpowiedź, ale dla każdego, kto natknie się na ten wątek, jak mam, jest ważna uwaga z propozycji, która moim zdaniem wnosi tutaj dodatkową wartość do dyskusji, szczególnie obawy w komentarzach dotyczących tego, czy
typedef
słowo kluczowe jest zostanie w przyszłości oznaczony jako przestarzały lub usunięty za zbędny / stary:Dla mnie oznacza to ciągłe wsparcie dla
typedef
słowa kluczowego w C ++, ponieważ wciąż może sprawić, że kod będzie bardziej czytelny i zrozumiały .Aktualizacja
using
słowa kluczowego była specjalnie dla szablonów i (jak wskazano w przyjętej odpowiedzi), gdy pracujesz z nie-szablonamiusing
itypedef
są one mechanicznie identyczne, więc wybór należy do programisty na podstawie czytelności i komunikacji intencji .źródło
Oba słowa kluczowe są równoważne, ale jest kilka zastrzeżeń. Jednym z nich jest to, że deklarowanie wskaźnika funkcji
using T = int (*)(int, int);
jest wyraźniejsze niż za pomocątypedef int (*T)(int, int);
. Po drugie, forma aliasu szablonu nie jest możliwatypedef
. Po trzecie, ujawnienie C API wymagałobytypedef
nagłówków publicznych.źródło