总之,能取址的一定是左值,除位域和寄存器变量(即register变量,但最新的编译器,如gcc,遇到代码中对register变量使用&取址时,会自动转换成普通变量,即register关键字被忽略了)以外,左值皆可取址,即能使用&取址运算符。
以下列表所有左值:
1. 变量,函数名,成员变量名,无论其类型,即使变量类型是右值引用,其名字构成的表达式仍是左值表达式。注意:
- 将函数指针传给std::cout会引发转换成bool型,即非空值输出1,空值输出0,详见:https://zh.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
- 右值引用本身是左值,因为右值引用是变量,且可以取址,我们可以用std::forward和std::move将变量转成右值
void setValue(int&& value) {
}
void transferValue(int&& value) {
setValue(a); // error, No matching function for call to 'setValue'
}
void transferValue(int&& value) {
setValue(std::move(value)); // ok
}
2. 函数调用或重载运算符表达式,其返回类型为左值引用。如std::cout << 1, str1 = str2, ++i等

本文详细介绍了C++中的左值,包括变量、函数调用、赋值表达式等多种形式,并提到了未决成员函数调用的概念。讨论了左值在函数调用、表达式中的角色以及右值引用与左值的关系。
最低0.47元/天 解锁文章
1101

被折叠的 条评论
为什么被折叠?



