博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
std::forward的性质.
阅读量:6378 次
发布时间:2019-06-23

本文共 2794 字,大约阅读时间需要 9 分钟。

hot3.png

更新于:16/8/28

//针对左值的情况.template
constexpr T&& my_forward(typename std::remove_reference
::type& value)noexcept{ std::cout << "my-forward: &" << std::endl; return (static_cast
(value));}//针对右值的情况.template
constexpr T&& my_forward(typename std::remove_reference
::type&& value)noexcept{ std::cout << "my-forward: &&" << std::endl; return (static_cast
(value));}

std::forward<T>用来完美转发,也就是说如果变量是个右值经过std::forward仍然是个右值,如果是个左值经过std::forward转发仍然是个左值.

demo:

#include 
#include
#include
#include
template
inlineconstexpr _Ty&& my_forward( typename std::remove_reference<_Ty>::type& _Arg) _NOEXCEPT{ // forward an lvalue as either an lvalue or an rvalue std::cout << "forward: &" << std::endl; return (static_cast<_Ty&&>(_Arg));}template
inlineconstexpr _Ty&& my_forward( typename std::remove_reference<_Ty>::type&& _Arg) _NOEXCEPT{ // forward an rvalue as an rvalue static_assert(!std::is_lvalue_reference<_Ty>::value, "bad forward call"); std::cout << "forward: &&" << std::endl; return (static_cast<_Ty&&>(_Arg));}template
class Node {private: T value;public: ~Node() = default; Node(T&& value_) :value(std::move(value_)) //注意这里我用了move!因为我们还有一个构造函数是const T& { //std::cout << std::boolalpha // << typename std::is_same
(value_))>::value // << typename std::is_same
::value // << typename std::is_same
(value_))>::value // << std::endl; std::cout << "constructor: &&" << std::endl; } Node(const T& value_) :value(value_) { std::cout << "constructor: const&" << std::endl; } void print()const { std::cout << this->value << std::endl; }};template
void wrapperFunction(T&& value){ print(value);}template
void wrapFunction(T&& value){ print(std::forward
(value));}template
void print(const T& value){ std::cout << "T& : " << value << std::endl;}template
void print(T&& value){ std::cout << "T&& :" << value << std::endl;}template
void packagePrint(T&& val){ using type = typename std::remove_reference
::type>::type; Node
(std::forward
(val));}template
void packagePrint(Type&& arg, Types&&... args){ using type = typename std::remove_reference
::type>::type; Node
(std::forward
(arg)); packagePrint(std::forward
(args)...);}int main(){ //case 1: int number = 50; //wrapperFunction(number); //output: T& : 50; //wrapperFunction(50); //output: T& : 50; //case 2: //wrapFunction(number); //output: T& : 50; //wrapFunction(50); //output: T&& :50; //case 3: packagePrint(20, number, std::basic_string
("shihuawoaini")); //注意这里!!!!!!!!!!!! int&& x = 10l; //此时的x其实是一个右值引用的左值!!!!!所以我们必须用std::forward才能保持. int& y = x; //int&& z = x; //error!. return 0;}

 

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/611327

你可能感兴趣的文章
基于WorsPress+Xampp搭建博客
查看>>
Weblogic多应用部署在一个域下导致session冲突
查看>>
安装Centos6 分区时出现缺少/boot/efi 经验分享
查看>>
javascript的一些基本概念
查看>>
关于Tomcat上请求的编解码问题
查看>>
WPF“动画序列”框架的初步研究与实现(附源码)
查看>>
Windows Server 2008 多元密码策略配置
查看>>
.NET中的泛型和Java泛型中的类型擦除
查看>>
白利用的集大成者:新型远控木马上演移形换影大法
查看>>
SAS 2016年全球营收达32亿美元 继续保持稳步增长
查看>>
2017必备的八款最佳反勒索软件工具
查看>>
从Effective Java总结一些有助安卓开发的建议
查看>>
以一当十的程序员不是传说
查看>>
Vizinex RFID 和Brady SmartID推出航空标签
查看>>
Facebook 否认趋势话题存在政治偏见,但将做出调整
查看>>
云纵发布“纵横客“ 新一代互联网CRM开启餐饮行业营销新模式
查看>>
物联网到底何时才能称为“爆发”?
查看>>
《Java多线程编程核心技术》——1.2节使用多线程
查看>>
不用惊慌 关于苹果警告的一些分析
查看>>
《VMware 网络技术:原理与实践》—— 2.3 OSI模型
查看>>