Рассмотрим следующий сценарийПочему конструктор копирования не вызывается, когда возвращаемое значение из перегруженного оператора передается
class Integer
{
long long n;
public:
Integer(long long i):n(i){}
Integer(){cout<<"constructor";}
void print()
{
cout<<n<<endl;
}
Integer(const Integer &a){cout<<"copy constructor"<<" "<<a.n<<endl;}
Integer operator+(Integer b);
};
Integer Integer:: operator+(Integer b)
{
this->n = this->n + b.n;
return *this;
}
int main()
{
// your code goes here
Integer a(5);
Integer b(6);
Integer c(a+b);//line 1
return 0;
}
Если a+b
был временным, то я понимаю, что конструктор копирования не будет называться. Но a+b
не возвращает временный. Выход я получаю
copy constructor 6 //this is because Integer object is passed as value to operator+
copy constructor -5232903157125162015 //this is when object is returned by value from operator+
Я думаю, что должен быть еще один вызов, когда a+b
используется для инициализации c
. Большинство связанных вопросов связаны с оптимизацией возвращаемых значений, но i
не может связывать RVO с этим.
Unrelated; Не следует писать 'b.n + = this-> n; return b; '? –
Отключить тему: 'a + b' как бы разбит. Он модифицирует 'a' способ, которым будет работать оператор + =. – user4581301
'a + b' * * * возвращает временный (поскольку' operator + 'возвращает значение), а вызов удаляется * copy elision *. –