void PrintName(string&& name) {
cout << "[rvalue] " << name << endl;
}
void PrintName(string& name) {
cout << "[lvalue] " << name << endl;
}
int main() {
string name{"Charles"};
PrintName(name); // [lvalue] Charles
PrintName("Charles"); // [rvalue] Charles
}
我重载了PrintName
以接受左值和右值。当我用左值name
调用它时,它工作良好,输出[lvalue] Charles
;当我直接用"Charles"
调用它时,它选择运行右值版本并输出[rvalue] Charles
。然而,我听说字符串字面值是左值,那么为什么不"Charles"调用PrintName
的左值版本?并且,我们如何编写一些代码来证明字符串字面值是左值?
在评论和回答的帮助下,我终于想出了写一段代码来证明字符串文字是lvalue
typedef const char stringliteral[8];
void PrintName(stringliteral&& name) {
cout << "[rvalue] " << name << endl;
}
void PrintName(stringliteral& name) {
cout << "[lvalue] " << name << endl;
}
通过"Charles"
调用PrintName
将运行右值版本。
字符串不是。原因是字符串字量存储在lvalue
.rodata
(只读数据)部分中(更多信息请参阅本网站),因此无法修改,因此它是rvalue
。
更新:我更正字符串字面值不是lvalues
的问题:见这里。