c++奇淫技巧之完美转发
时间:2022-07-22
本文章向大家介绍c++奇淫技巧之完美转发,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
解决什么问题
在介绍完美转发之前,我们先来看下面的一段代码。
void foo(const shape&)
{
puts("foo(const shape&)");
}
void foo(shape&&)
{
puts("foo(shape&&)");
}
void bar(const shape& s)
{
puts("bar(const shape&)");
foo(s);
}
void bar(shape&& s)
{
puts("bar(shape&&)");
foo(s);
}
int main()
{
bar(circle());
}
我们猜下,上面会输出什么。 ===============================留你思考=================================
circle()会生成一个右值,所以会调用bar(shape&&)
,这个时候参数s
变为了左值,所以会调用foo(const shape&)
,所以以上的输出是:
bar(shape&&) foo(const shape&)
如果我们希望保持bar函数收到的右值引用,我们就要变为下面的调用方式:
void bar(shape&& s)
{
puts("bar(shape&&)");
foo(std::move(s));
}
可以看到了,bar函数为了保证在转发参数的过程中,保持参数的值类别:左值的仍然是左值,右值的仍然是右值,不得不重载两个bar函数,那有什么简单的方法能够实现呢?
这就有了c++标准库中的std::forward
,即转发引用(forwarding reference),也叫做万能引用(universal reference),具体到实现上来说就是:
template<typename T>
void bar(T &&s) {
foo(std::forward<T>(s));
}
此时再看下面的输出:
circle temp;
bar(temp);
bar(circle());
大家应该能够很容易回答上来了。
总结
本文介绍了c++中转发引用的使用场景:保证在转发参数的过程中,保持参数的值类别:左值的仍然是左值,右值的仍然是右值。
最后一段代码的输出,欢迎留言的。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法