关于c ++:C ++ 11中’typedef’和’using’有什么区别?

What is the difference between 'typedef' and 'using' in C++11?

我知道,在C++ 11中,我们现在可以使用EDCOX1×0来写类型别名,比如EDCOX1,1,s:

1
typedef int MyInt;

据我所知,相当于:

1
using MyInt = int;

这种新的句法是从试图表达"template typedef"的努力中产生的:

1
template< class T > using MyType = AnotherType< T, MyAllocatorType >;

但是,对于前两个非模板示例,标准中还有其他细微的差异吗?例如,typedef以"弱"的方式进行混叠。也就是说,它不创建新类型,只创建新名称(这些名称之间的转换是隐式的)。

它是与using相同还是生成一个新类型?有什么区别吗?


根据标准(重点矿山)(7.1.3.2),它们是等效的:

A typedef-name can also be introduced by an alias-declaration. The
identifier following the using keyword becomes a typedef-name and the
optional attribute-specifier-seq following the identifier appertains
to that typedef-name. It has the same semantics as if it were
introduced by the typedef specifier. In particular, it
does not define a new type and it shall not appear in the type-id.


在模板中使用时,使用语法具有优势。如果需要类型抽象,还需要保持模板参数在将来可以指定。你应该这样写。

1
2
3
4
5
6
7
8
9
10
template <typename T> struct whatever {};

template <typename T> struct rebind
{
  typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};

rebind<int>::type variable;

template <typename U> struct bar { typename rebind<U>::type _var_member; }

但是使用语法简化了这个用例。

1
2
3
4
template <typename T> using my_type = whatever<T>;

my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }


它们基本上是相同的,除了:

The alias declaration is compatible with templates, whereas the C
style typedef is not.


它们基本上是相同的,但using提供了alias templates,这非常有用。我能找到一个很好的例子如下:

1
2
3
namespace std {
 template<typename T> using add_const_t = typename add_const<T>::type;
}

所以我们可以用std::add_const_t代替typename std::add_const::type