c++ - 类型别名 - template typedef




在C++ 11中'typedef'和'using'有什么区别? (3)

我知道在C ++ 11中,我们现在可以using用于写入类型别名,如typedef s:

typedef int MyInt;

据我所知,相当于:

using MyInt = int;

这种新的语法来源于努力去表达“ template typedef ”:

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

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

它是否与using相同或是否会生成新类型? 有什么区别吗?


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

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; }

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

template <typename T> using my_type = whatever<T>;

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

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

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

所以,我们可以使用std::add_const_t<T>来代替typename std::add_const<T>::type


除此之外,它们在很大程度上是相同的

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







using-declaration