神刀安全网

C++11类型系统:类型推演

C++ feels like a new language. — Bjarne Stroustrup

增强了的「类型系统」是C++11最大的优化亮点之一,为此需要深入剖析「类型推演」的工作机理,并能灵活地运用auto, decltype,这是C++11最重要的基石。

templateauto

C++98早已具备类型推演的能力,用于模板的类型推演。

C++11类型系统:类型推演

C++11中,autotemplate的类型推演能力基本类似,只存在唯一的差异:Braced Initialization,或称为Universal Initialization

C++11类型系统:类型推演

非常量的左值引用

C++11类型系统:类型推演

需要注意的是,推演auto &r2 = r, auto &cr2 = cr时,即使r(int&), cr(const int&)是引用变量,需要去除引用后再尝试类型推演,因为使用「引用变量」等价于使用其「引用对象」本身。

C++11类型系统:类型推演

常量的左值引用

因为const T&const auto&已经具备了const的属性,当const的左值对象赋予它所发生的自动类型推演,其模板参数T,及其auto的类型无需推演为const属性。

C++11类型系统:类型推演

C++11类型系统:类型推演

指向非常量的指针

指针的推演能力与引用类似。

C++11类型系统:类型推演

需要注意auto *p = &i; auto p = &i两种写法的不一样,一种是显式的指针类型,另外一种完全依赖于auto的类型推演能力。

C++11类型系统:类型推演

指向常量的指针

与指向非常量的指针推演机制一致,在此不再冗述。

C++11类型系统:类型推演

C++11类型系统:类型推演

按值传递

Pass-By-Value,经过拷贝之后,两者之间已无任何瓜葛,为此const的处理机制有别于其他情况。

C++11类型系统:类型推演

C++11类型系统:类型推演

C++11类型系统:类型推演

但存在两类特殊的,遗留的C-Style情况,为保证兼容性,存在特殊的类型推演机制。

遗留的C-style字符串

C++11类型系统:类型推演

遗留的C-style函数

C++11类型系统:类型推演

通用引用:Universal Reference

所谓Universal Reference,因为其能Can bind to anything,所以称为「通用引用」,具有如下方面的特点:

  • Can bind to lvalue or rvalue;
  • Can bind to const/non-const, volatile/non-volatile, or both;
  • So, it can bind to anything.

需要注意的是,Universal Reference并非「右值引用(Rvalue Reference)」,即使它们两者都有类似的T &&的修饰符。规则非常简单,Universal Reference具备两个最基本的特征:

  • T &&, auto&&: 必须具备的句法结构
  • type reduce:必须发生类型推演

可以简单归纳之,Universal Reference出现于如下两种常见:

template <typename T> void f(T&& t);  auto&& r = i;

Universal Reference类型推演也存在特殊性:

  • Universal Reference持有左值时,发生Reference Collapsing机制。例如auto&& t = i,当auto推演为int&auto&& t推演为int& && t,而int& &&经过Reference Collapsing机制,被进一步规约为int&,与原来它持有左值刚好匹配。

  • Universal Reference持有右值时,推演规则较为直观,例如auto&& t = 10,当auto被推演为int,则auto&& t推演为int&& t,与原来它持有右值刚好匹配。

C++11类型系统:类型推演

C++11类型系统:类型推演

C++11类型系统:类型推演

通用初始化:Braced Initialization

这是templateauto类型推演能力之间存在的唯一差别。

C++11类型系统:类型推演

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » C++11类型系统:类型推演

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址