故事要从 <vector>
头文件说起。
查看 push_back
函数,发现有两个重载。
_CONSTEXPR20 void push_back(const _Ty& _Val) { // insert element at end, provide strong guarantee
emplace_back(_Val);
}
_CONSTEXPR20 void push_back(_Ty&& _Val) {
// insert by moving into element at end, provide strong guarantee
emplace_back(_STD move(_Val));
}
我们看看在参数为右值的情况下,两种参数描述是否会表现出相同的行为。进行如下两个实验:
#include <iostream>
using namespace std;
void f(int&& x)
{
cout << &x;
}
int main()
{
int x = 0;
cout << &x << "\n";
f(move(x));
return 0;
}
#include <iostream>
using namespace std;
void f(const int& x)
{
cout << &x;
}
int main()
{
int x = 0;
cout << &x << "\n";
f(move(x));
return 0;
}
发现输出的地址都是相同的,这说明这两种方式都能够避免创建新变量。那么为什么需要右值引用呢?
原因很简单,使用常量左值引用时不能修改参数,而使用右值引用时可以修改。
综上,对于不同情况,应该使用不同的参数描述。这样做使得程序在满足功能需求的同时达到效率最大化。
标签:Val,右值,void,左值,back,引用 From: https://www.cnblogs.com/enthalpy/p/17278707.html