大约 2 分钟
传递的内容类型
类型 | ||
---|---|---|
值类型 | 在栈上 | |
引用类型 | 在堆上 | |
求值策略
调用函数的参数的求值和传值方式
参数是一个表达式/单变量
求值策略 | 求值时间 | 传值类型 |
---|---|---|
值传递 | 调用前 | 副本 |
引用传递 | 调用前 | 原值 |
名传递 | 调用后 | 名 |
名传递参考scala 主要是求值时间的问题
总体效果
变量代表什么? | 变量赋值效果 | 求值策略 | 传递的内容类型 | |||
---|---|---|---|---|---|---|
java | 基本数据类型 | 存储数据的地址 | 修改存储的内容 | 值传递 | 值类型 | |
引用类型 | 存储地址的地址 | 修改存储的内容 | 值传递 | 引用类型 | ||
Cpp的类型标志
左值引用 | T& | 只能绑定左值 |
右值引用 | T&& | 只能绑定右值 |
常量左值 | const T& | 既可以绑定左值又可以绑定右值 |
常量右值 | const T&& | 绑定右值 |
万能引用 | auto && |
- value
- glvalue范左值
- lvalue左值
- xvalue将亡值
- rvalue右值
- prvalue纯右值
- xvalue将亡值
- glvalue范左值
左值
得到的变量“名称”
字符串字面量
性质
可以取地址
- 可以通过内建的取址运算符取左值的地址:&++i[1] 及 &std::endl 是合法表达式。
- 可修改的左值可用作内建赋值和内建复合赋值运算符的左操作数。
- 左值可以用来初始化左值引用;这会将一个新名字关联给该表达式所标识的对象。
纯右值
字面量
不具名的临时对象
性质
纯右值不具有多态:它所标识的对象的动态类型始终是该表达式的类型。
非类非数组的纯右值不能有 cv 限定,除非它被实质化以绑定到 cv 限定类型的引用 (C++17 起)。(注意:函数调用或转型表达式可能生成非类的 cv 限定类型的纯右值,但它的 cv 限定符通常被立即剥除。)
纯右值不能具有不完整类型(除了类型 void(见下文),或在 decltype 说明符中使用之外)
纯右值不能具有抽象类类型或它的数组类型。