Странное поведение деструктора С++

Код:

shared_ptr<People> func() noexcept
{
    shared_ptr<People> p = make_shared<Man>();
    return p; //1
}

int main() noexcept
{
    shared_ptr<People> pep = func();
    pep->Speak();

    return 0;
}

На строчке под комментарием 1 должен вызываться деструктор объекта p, но этого не происходит и код работает, почему?


Ответы (1 шт):

Автор решения: d1ke

Деструктор не вызывается из-за оптимизации компилятора (см. copy elision). В случаях когда применить её невозможно, из метода будет возвращена копия p, поэтому всё будет работать в любом случае.

→ Ссылка