Скопировать конструктор странное поведение при возврате по значению

Я проверил поведение конструктора копирования с помощью функций, возвращающих объект по значению, и натолкнулся на случай, когда конструктор копирования вызывается, а случай - нет.

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

class A {
public:
    A() {}
    A(const A& a) {
        cout << "Copy CTOR: " << "This address is " << this 
             << " input address is "<< &a <<       "\n";
    }
};

A returnMyself(A& a) {
    cout<<"Myself address is: "<< &a << "\n";
    return a;
}

A returnLocal(A& a) {
    A local;
    cout<<"local address in returnLocal is  "<< &local << "\n";
    return local;
}

int main () {
    A a;
    cout<<"Before returnMyself\n";
    returnMyself(a);
    cout<<"After returnMyself\n\n";

    cout<<"Before returnLocal\n";
    returnLocal(a);
    cout<<"After returnLocal\n";
}

Выход из main является:

Перед возвращением.
Мой адрес: 0x7fff6afd88f0.
Скопировано CTOR: Этот адрес 0x7fff6afd88d8. Входной адрес 0x7fff6afd88f0.
После возвращения.

Перед возвращением
Локальный адрес в returnLocal - 0x7fff6afd88d0.
После возврата

Как вы можете видеть, когда я объявляю локальный объект и возвращаю его, конструктор копирования не вызывается, в отличие от возврата заданного ссылочного объекта, который вызывает конструктор копирования.

У кого-нибудь есть объяснение этому? В общем, каковы случаи вызова конструктора копирования из функции, которая возвращает значение по значению?

Спасибо!

1 ответ

Решение

Это копия elision. Компилятор достаточно умен, чтобы оптимизировать эту копию.

Другие вопросы по тегам