暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Item9 优先使用using别名声明而不是typedef

程序员的Cookbook 2020-07-29
739

   C++11中引入的 std::unique_ptr
智能指针是个好用的东西,在我们使用 unique_ptr
的时候往往会写出这样的类型 std::uniqeu_ptr<std::unordered_map<std::string,std::string>>
,看上去很臃肿,因此大多数的时候我们会选择使用 typedef
进行类型的重定义,简化类型名称。可是在C++11中引入了一个 using
别名的机制,相比较而言引入这个机制会有其深层次的用意。

   看上去 using
别名机制更加清晰,这或许是引入 using
别名机制的原因之一吧。

typedef
没有办法在模板声明的作用域中做类型重定义,必须放在一个自定义类型作用域内。而using没有这个限制除了上面提到的两点外 using
还有一些其他的优点,比如对于嵌套类型来说不需要使用 typename

   使用 typedef
定义的嵌套类型在模板中需要使用 typename
,至于为什么可以参考cppreference对于 using
来说则不一样,因为使用了 using
就不会有 ::type
这样的后缀(不需要自定义类型就可以使用using来定义类型别名),因为这个后缀会让编译器迷惑这到底是类型还是成员变量,使用 using
则避免了这个问题,因为没有 ::type
,并且 aliasLitst<T>
肯定是一个类型。尽管 using
有以上诸多优点但是C++11中的 type_trais
却大量用了 typedef
,不过好在C++14中标准委员会认识到了 using
是最好的方式并对C++11中的全部进行了替换。

到了C++14上面的 ::type
都可以去掉了。

Tips

  1. typedef不支持模版化,但是using的别名声明可以

  2. 模版别名避免了传统的typedef带来的 ::type
    后缀,以及在类型引用的时候需要的typename前缀的问题

  3. C++14给所有的C++11模版类型萃取提供了别名


文章转载自程序员的Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论