Конструктор копирования не вызывается при возврате из перегруженного оператора + в перегруженный оператор =

Рассмотрим следующий код:

#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, просто нормальный отбор временников.