Скопировать конструктор странное поведение при возврате по значению
Я проверил поведение конструктора копирования с помощью функций, возвращающих объект по значению, и натолкнулся на случай, когда конструктор копирования вызывается, а случай - нет.
Пожалуйста, рассмотрите следующий код:
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. Компилятор достаточно умен, чтобы оптимизировать эту копию.