Подтвердить что ты не робот

Оператор +, разница между типами классов и встроенными типами?

Я новичок в С++. Книга, которую я читаю, говорит мне, что если оператор плюс (+) был перегружен для некоторого объекта класса, скажем, класса 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?

4b9b3361

Ответ 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.