Задать вопрос
@RusichNSK

Корректно ли вызывать метод у временного объекта?

Добрый день.

В Builder C++ придумал вот такое выражение:
std::make_unique<TForm>(Application)->ShowModal();

По моему представлению, код корректный (и он работает). Но, DeepSeek упорно утверждает, что так делать нельзя - unique_ptr начнет разрушать хранимый объект TForm раньше, чем система освободит ресурсы формы.

Эту же конструкцию я использую и вот в таком виде:
if(std::make_unique<TForm>(Application)->ShowModal() == mrOk)
    sb_refreshClick(Sender);
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
DeepSeek галлюционирует. Временные объекты живут до конца выражения. unique_ptr начнет уничтожение после выполнения всего выражения.

Вот ссылки на стандарт:

make_unique<> является prvalue: https://en.cppreference.com/w/cpp/language/value_c...
prvalue: a function call or an overloaded operator expression, whose return type is non-reference


В момент вызова происходит материализация временного объекта: https://en.cppreference.com/w/cpp/language/lifetime

Temporary objects are created ... in the following situations:
when performing member access on a class prvalue.


Там же написано:
All temporary objects are destroyed as the last step in evaluating the full-expression


Т.е. возвращенный make_unique объект будет уничтожен только в конце строки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы