В основном есть 2 объекта: A a,b;
, один объект в теле функции f()
: A b;
, а затем есть временный объект, который копируется, и его копия сохраняется в b
.
При возврате b
в тело вашей функции сначала создается копия, затем локальный b
уничтожается, затем копия присваивается переменной b
, объявленной в main, а затем эта копия уничтожается.
Добавьте следующую строку в определение класса A
и посмотрите сами:
A(const A&) { cout << "copying" << endl; }
С Именованная оптимизация возвращаемого значения , компилятор пытается устранить лишний конструктор Copyи Destructor вызывает , что означает, что local b
из функции f()
будет назначен переменной b
в main без создания копии.Таким образом, с помощью RVO / NRVO в вашем случае создаются только 3 объекта.
Хотя есть способ избежать разрушения этой копии без RVO в вашем случае:
A a;
A b = a.f();
в этом случае копиявозвращаемого значения функции f()
создается и сохраняется как переменная b
.Это также означает, что оператор присваивания не вызывается, и в main создаются только 2 объекта: a
и копия b
, возвращаемая f()
.
Надеюсь, это поможет.