gpt4 book ai didi

c++ - 为什么字符串不会出现左操作数所需的错误左值?

转载 作者:行者123 更新时间:2023-12-02 02:39:15 25 4
gpt4 key购买 nike

在下面的代码片段中,为什么行 2 + 3 = 5 语句给出错误,但分配给字符串连接的下一个语句编译成功?

#include <string>

int main() {
2 + 3 = 5; // Error: lvalue required as left operand of assignment
std::string("2") + std::string("3") = std::string("5"); // Compiles successfully. why?
return 0;
}

我的理解是表达式的左侧 std::string("2") + std::string("3") = std::string("5") 将生成临时值,即右值。这意味着我要分配给 rvalue - 就像 2 + 3 = 5 一样。因此它还应该给出 lvalue required as left operand of assignment 错误。但事实并非如此。

最佳答案

说明

对于类类型,赋值是通过复制和移动赋值运算符实现的。 std::string 是一个类,所以

std::string("2") + std::string("3") = std::string("5")

只是语法糖

(std::string("2") + std::string("3")).operator=(std::string("5"))

operator= 是一个成员函数。通常,可以对左值和右值调用成员函数。因此,这个表达式是有效的。

标准引用

对于非重载的operator=(即对于int):[expr.ass]/1

The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand. [...]

对于重载operator=(对于std::string):[expr.ass]/4

If the left operand is of class type, the class shall be complete. Assignment to objects of a class is defined by the copy/move assignment operator ([class.copy], [over.ass]).

(强调我的观点)

关于c++ - 为什么字符串不会出现左操作数所需的错误左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58676253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com