Конструктор и область действия C++

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

Что если я просто верну сам объект (не ссылку на него)? Будет ли вызван конструктор копирования? (Я слышал термин "переместить конструктор", но из того, что я прочитал, кажется, что это новая функция. Кто-нибудь может подробнее остановиться на этом?)

В каких случаях будет вызываться деструктор?

3 ответа

Решение

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

Исправьте, и деструктор будет вызван, когда он выйдет из области видимости.

Что если я просто верну сам объект (не ссылку на него)? Будет ли вызван конструктор копирования?

МОЖЕТ быть вызван конструктор копирования и деструктор, но обычно компилятор выполняет оптимизацию возвращаемого значения, и копирование, деструктор или перемещение не производятся.

Чтобы узнать о конструкторах ходов, прочитайте семантику ходов и ссылки на значения.

Компилятор попытается оптимизировать такие функции, чтобы исключить операции копирования. Результирующий код будет вести себя так, как будто объект был создан в точке, где функция вернет его с соответствующим временем жизни. Ссылка здесь. Это зависит от компилятора и структуры самого кода как в точках построения, так и в точках использования. Оптимизация также может быть невозможна, и в этом случае у вас могут быть вызовы для копирования или перемещения конструктора, если он доступен.

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

Если оптимизация отсутствует, то объект будет скопирован в другой в точке использования (один вызов конструктора копирования / перемещения), затем объект в функции будет уничтожен (если скопирован), и, наконец, деструктор скопированного / перемещенный объект будет вызван, когда он выйдет из области ближайшего блока в том месте, где функция вернула его (точка использования).

Однако, если вы вернете временное значение из функции, то вы вернете ссылку или указатель на разрушенную память, потому что ваше временное состояние выйдет из области видимости после возврата из функции и будет уничтожено.

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

Правильно, и многие компиляторы будут предупреждать вас.

Что если я просто верну сам объект (не ссылку на него)? Будет ли вызван конструктор копирования?

Это вызвало бы конструктор копирования. Стандартный стандарт std::array не имеет конструктора std::move, поскольку он использует внутреннюю память стека. Следовательно, конструктор копирования будет вызван.

В каких случаях будет вызываться деструктор?

В обоих случаях вызывается деструктор. Просто после конструктора перемещения мы перемещаем все указатели / обрабатываемые объекты на другой объект, поэтому состояние объекта будет пустым (но непротиворечивым).

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