神刀安全网

C++11类型系统:「std::move」与「std::forward」

It ain’t over till the fat lady sings. — Opera proverb

std::movestd::forward是两个及其容易混淆的实用函数,本文通过剖析两个函数的「类型推演」过程,深入了解C++类型系统的推演机制,最后总结归纳两个函数的「习惯用法」或「实现模式」。

剖析std::move

C++11实现

C++11类型系统:「std::move」与「std::forward」

当传递左值时

经过如下的类型推演过程,当传递「左值」时,std::move强制转为换「右值引用」。

C++11类型系统:「std::move」与「std::forward」

当传递右值时

经过如下的类型推演过程,当传递「右值」时,std::move顺水推舟,传递「右值引用」。综上述,借助「通用引用」的能力,std::move其实完成了「无条件的」右值引用转换规则。

C++11类型系统:「std::move」与「std::forward」

C++14改进实现

C++11类型系统:「std::move」与「std::forward」

剖析std::forward

C++11实现

C++11类型系统:「std::move」与「std::forward」

当传递左值时

经过如下的类型推演过程得知,当传递「左值」时,std::forward完成「左值」的「转发」机制。

C++11类型系统:「std::move」与「std::forward」

当传递右值时

经过如下的类型推演过程得知,当传递「右值」时,std::forward也完成「右值」的「转发」机制。为此,std::forward的机制,完成了C++11的「完美转换」(Perfect Forward)的机制。

C++11类型系统:「std::move」与「std::forward」

C++14改进实现

C++11类型系统:「std::move」与「std::forward」

习惯用法

C++11类型系统:「std::move」与「std::forward」

回顾

C++11类型系统:「std::move」与「std::forward」

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » C++11类型系统:「std::move」与「std::forward」

分享到:更多 ()

评论 抢沙发

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