using别名声明和typedef声明都可以完成一个类型的声明,但使用using可以很简单且直接的完成这个操作,下面将通过代码分别声明相同的类型,就可以看出using的好处了。

//声明指针函数
typedef void(*FP)(int ,double);   //typedef晦涩不直白
using FP = void(*)(int ,double); //using简单直白


//typedef声明一个模板,表示一个链表
template<class T>
struct MyAllocList{
  typedef std::list<T,MyAlloc<T>> type;//typedef晦涩不直白
};

MyAllocList::type myList;  //类型使用晦涩不直白


//using 声明一个模板,表示一个链表
template<class T>
using MyAllocList std::list<T,MyAlloc<T>>;//using简单直白
MyAllocList myList;//类型使用简单直白

特别还有一种情况,如果这时候你想在一个模板内,使用typedef来创建一个链表,但是它容纳的类型有模板参数指定的话,那你不得不在typedef的前面加上一个typename前缀,以表明该typedef是一个类型。但是使用using的话,完全不必要。

//typedef声明一个模板,表示一个链表
template<class T>
struct MyAllocList{
  typedef std::list<T,MyAlloc<T>> type;//typedef晦涩不直白
};

template<class T>
class Widget {
private:
    typename MyAllocList<T>::type list;//必须加上typename,否则编译器不知道其是个类型
};


//using 声明一个模板,表示一个链表
template<class T>
using MyAllocList std::list<T,MyAlloc<T>>;//using简单直白

template<class T>
class Widget {
private:
    MyAllocList<T> list;//so easy
};