Why do type aliases in C++ use ‘using’ instead of ‘typedef’ in their syntax?

Here is what Bjarne Stroustrup says about why they introduced using instead of extending typedef:

The keyword using is used to get a linear notation “name followed by
what it refers to.” We tried with the conventional and convoluted
typedef solution, but never managed to get a complete and coherent
solution until we settled on a less obscure syntax.

He also claims that he likes this syntax also more for usual typedefs:

In addition to being important in connection with templates, type
aliases can also be used as a different (and IMO better) syntax for
ordinary type aliases:

using PF = void (*)(double);

He is quite correct here, this seems very clean. In contrast a typedef would be extremely convoluted with the name being somewhere in the middle:

typedef void(*PF)(double);

Here is an explanation (see page 4) from their proposal that is even more in-depth:

It has been suggested to (re)use the keyword typedef — as done in the
paper [4] — to introduce template aliases:

template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;

That notation has the advantage of using a keyword already known to introduce a type alias. However, it also displays several disadvantages among which the confusion of using a keyword known to introduce an alias for a type-name in a context where the alias does not designate a type, but a template; Vec is not an alias for a type, and should not be taken for a typedef-name. The name Vec is a name for the family std::vector<*,MyAllocator<*>> – where the asterisk is a placeholder for a type-name.
Consequently, we do not propose the “typedef” syntax.

template<class T>
using Vec = std::vector<T,MyAllocator<T>>;

can be read/interpreted as: from now on, I’ll be using Vec<T> as a synonym for std::vector<T,MyAllocator<T>>. With that reading, the new syntax for aliasing seems reasonably logical.

So he has basically two points here:

  1. A using template becomes a family of types, not a type, so typedef is “wrong”
  2. using can be read almost as an english sentence

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)