1. 左值和非左值概念
- 左值概念:左值参数是可被引用的数据对象,例如:变量、数组元素、结构成员、引用和接触引用的指针
- 非左值概念:包括字面常量(用引号括起的字符串除外,它们由其地址表示)和包含多项的表达式
2. 代码示例
#include <iostream>
using namespace std;
//! 当函数形参为非const引用时,接受引用参数的参数的意图是修改作为参数传递进来的变量,如果创建临时变量,
//! 则会阻止这种意图的实现,故C++编译器禁止创建临时变量
void Swap(int &a) {}
//! 当函数形参为const引用时,后面两种情况会创建临时变量:1. 实参的类型正确,但不是左值;2.实参的类型不正确,但可以转换为正确的类型。
void Print(const int &a){}
int main(void)
{
int x = 10;
//Swap(3); //< 错误:传入的参数为非左值,则编译器会报错,禁止生成临时变量接收3
//Swap(3+x); //< 错误:3+x为非左值,而是一个表达式,禁止生成临时变量来接收3+x的值
Print(3); //< 正确:传入的参数为非左值,则会生成1个临时变量,让形参a的引用指向这个临时变量,函数使用完后,临时变量才销毁
Print(3+x); //< 正确:传入的为非左值,而是一个表达式,会生成临时变量来接收3+x的值,让形参a指向这个临时变量,函数使用完后临时变量才销毁
system("pause");
return 0;
}
3. 参考书籍
《C++ Primer Plus》第六版 —— 8.2.3 引用的属性和特别之处