I know that in C++11 we can now use using
to write type alias, like typedef
s:
typedef int MyInt;
Is, from what I understand, equivalent to:
using MyInt = int;
And that new syntax emerged from the effort to have a way to express "template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
But, with the first two non-template examples, are there any other subtle differences in the standard? For example, typedef
s do aliasing in a "weak" way. That is it does not create a new type but only a new name (conversions are implicit between those names).
Is it the same with using
or does it generate a new type? Are there any differences?
The using syntax has an advantage when used within templates. If you need the type abstraction, but also need to keep template parameter to be possible to be specified in future. You should write something like this.
But using syntax simplifies this use case.
They are largely the same, except that:
They are essentially the same but
using
providesalias templates
which is quite useful. One good example I could find is as follows:So, we can use
std::add_const_t<T>
instead oftypename std::add_const<T>::type
They are equivalent, from the standard (emphasis mine) (7.1.3.2):