Конструктор копирования не вызывается при возврате из перегруженного оператора + в перегруженный оператор =
Рассмотрим следующий код:
#include <iostream>
using namespace std;
class loc
{
int longitude, latitude;
public:
loc() {}
loc(int lg, int lt)
{
longitude = lg;
latitude = lt;
}
loc(const loc& l)
{
cout << "a" << endl;
}
loc operator = (loc op2)
{
longitude = op2.longitude;
latitude = op2.latitude;
return *this;
}
loc operator+(loc op2);
};
loc loc::operator+(loc op2) {
loc temp;
temp.longitude = op2.longitude + longitude;
temp.latitude = op2.latitude + latitude;
return temp;
}
int main()
{
loc ob1(10, 20), ob2( 5, 30);
ob1 = ob1 + ob2;
return 0;
}
При компиляции этой программы с помощью команды: g++ file.cpp
, вывод был:
a
hello
А затем скомпилировать эту программу с помощью команды: g++ -fno-elide-constructors file.cpp
, вывод был:
a
a
a
hello
Мой вопрос:
В первом случае, почему исключены два конструктора копирования?
Какие конструкторы копирования в любом случае исключены? Есть ли другой механизм для = оператора или + оператора
РЕДАКТИРОВАТЬ
Я знаю, как должен выглядеть правильный оператор присваивания или конструктор копирования. Пожалуйста, ответьте, почему два конструктора копирования исключены в приведенном выше случае, а не исправляют оператор присваивания.
1 ответ
Одной из утвержденных копий является возврат из op+. RVO позволяет создать результат непосредственно в конечном пункте назначения, опуская temp
в целом. Элитированная копия от temp
,
Вторая удаленная копия передает результат op+, который является временным, в op=. Вместо этого он обеспечивает непосредственное построение результата op + в op2
параметр. Это не RVO, просто нормальный отбор временников.