C++ - 由于字符串文字是左值,为什么它可以传递给void PrintName(string&& name);?


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的问题:见这里。

相关内容

最新更新