【C++11】完美转发的使用以及万能引用

博客主页: 主页
系列专栏: C++
❤️感谢大家点赞收藏⭐评论✍️
期待与大家一起进步!


文章目录

  • 一、模板中的&& 万能引用
    • 右值引用变量的类型会被编译器识别为左值类型
  • 二、完美转发
    • 1.使用场景


一、模板中的&& 万能引用

  1. 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
    2.模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }

void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }

// 万能引用:既可以接收左值,又可以接收右值
// 实参左值,他就是左值引用(引用折叠)
// 实参右值,他就是右值引用
template<typename T>
void PerfectForward(T&& t)
{
	// 完美转发,t是左值引用,保持左值属性
	// 完美转发,t是右值引用,保持右值属性
	Fun((t));
}

int main()
{
	PerfectForward(10);           // 右值

	int a;
	PerfectForward(a);            // 左值
	PerfectForward(std::move(a)); // 右值

	const int b = 8;
	PerfectForward(b);		      // const 左值
	PerfectForward(std::move(b)); // const 右值

	return 0;
}

但运行结果却不像我们想的那样
【C++11】完美转发的使用以及万能引用_第1张图片

右值引用变量的类型会被编译器识别为左值类型

如何证明呢?
证明结果如下
【C++11】完美转发的使用以及万能引用_第2张图片

【C++11】完美转发的使用以及万能引用_第3张图片
所以我们需要用完美转发来实现属性的转变

二、完美转发

std::forward 完美转发在传参的过程中保留对象原生类型属性
【C++11】完美转发的使用以及万能引用_第4张图片
这里模板里面的T要是为实例化的,我们T的类型是根据你传入的实参t的类型来推导的

1.使用场景

【C++11】完美转发的使用以及万能引用_第5张图片

你可能感兴趣的:(c++,开发语言)