Оператор +, разница между типами классов и встроенными типами?
Я новичок в С++. Книга, которую я читаю, говорит мне, что если оператор плюс (+
) был перегружен для некоторого объекта класса, скажем, класса 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
не являются изменяемыми значениями. Мой вопрос: почему оператор +
возвращает изменяемое значение lvalue для объектов string
, но не для int
?
Ответы
Ответ 1
Он не возвращает модифицируемое значение lvalue для строки. Он возвращает временный объект, а s1+s2
и x+y
- оба значения r.
Однако объекты типа класса могут перегружать operator=
, что делает string
. Вам разрешено вызывать функции-члены на rvalues.
Разница между двумя случаями находится в =
(не +
)
Ответ 2
Для std::string
, s1 + s2 = s3
на самом деле:
(operator+(s1, s2)).operator =(s3)
s1 + s2
возвращает значение rvalue
Методы участников могут применяться и к временным.
Поскольку С++ 11, у нас есть определитель lvalue/rvalue для метода,
поэтому вы можете запретить o1 + o2 = o3
для своего пользовательского типа:
struct Object
{
Object& operator =(const Object& rhs) & ; // Note the & here
};
поэтому Object::operator =
может применяться только к lvalue.