我是C ++的新手。我读过的那本书告诉我,如果加号(+
)运算符已经为某个类对象重载,比如string
类,那么这个问题会更加具体。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1("abc");
string s2("def");
string s3("def");
cout<<(s1+s2=s3)<<endl;
int x=1;
int y=2
int z=3;
cout<<(x+y=z)<<endl;
return 0;
}
正如您所料,第一个cout
语句是正确的,而第二个是错误的。编译器投诉x+y
不是可修改的左值。我的问题是为什么+
运算符会为string
个对象返回一个可修改的左值,而不是int
?
答案 0 :(得分:20)
它不会为字符串返回可修改的左值。它返回一个临时对象,s1+s2
和x+y
都是右值。
但是,类类型的对象可能会重载operator=
string
。您可以在rvalues上调用成员函数。
这两种情况的区别在于=
(不是+
)
答案 1 :(得分:14)
对于std::string
,s1 + s2 = s3
实际上是:
(operator+(s1, s2)).operator =(s3)
s1 + s2
返回右值
会员方法也可以适用于临时。
从C ++ 11开始,我们有方法的左值/右值限定符,
因此,您可以禁止o1 + o2 = o3
使用自定义类型:
struct Object
{
Object& operator =(const Object& rhs) & ; // Note the & here
};
所以Object::operator =
只能应用于左值。