TGViewer
C++ Moscow C++ Moscow @cppmoscow_info · 448 subscribers
Post #75 585
#quiz #explanation #cpp23

Конечно, это очень странный код и писать подобное в проде недопустимо. Но если говорить о его нормативном статусе, то тут есть нюансы.

В C++20 этот код корректен: согласно [
class.temporary#6], время жизни std::vector<int>{42, 17, 13}, являющегося временным объектов, продлевается до конца цикла for, так что мы можем безопасно по нему итерироваться. Временный же объект std::scoped_lock{m} создается и сразу уничтожается: для него не применимо ни одно из правил продления жизни.

В C++23 же существующее поведение было изменено:
P2644R1 добавил в стандарт следующий пункт:

> There are three four contexts in which temporaries are destroyed at a different point than the end of the full-expression. ...

> The fourth context is when a temporary object other than a function parameter object is created in the for-range-initializer of a range-based for statement. If such a temporary object would otherwise be destroyed at the end of the for-range-initializer full-expression, the object persists for the lifetime of the reference initialized by the for-range-initializer.

То есть, теперь времена жизни всех (за незначительными исключениями) объектов, созданных в инициализаторе range-based for, продлеваются до конца цикла. Так что если рассматривать приведенный выше код: мы создаем временный объект
std::scoped_lock{m}, чье время жизни продлевается до конца цикла; после чего создаем временный объект std::vector<int>{42, 17, 13}, время жизни которого продлевается так же; и дальше в цикле на первой же итерации создаем новый объект std::scoped_lock guard{m}, захватывающий мьютекс, который уже был захвачен предыдущим std::scoped_lock — и тем самым получаем состояние взаимной блокировки (deadlock), которое стандартом определяется как неопределенное поведение.
  • ❤ 3
  • 👍 3
  • 🔥 1
More from @cppmoscow_info
  1. Aug 11, 2024#article #original Реализуем эффективный тупль с помощью C++26 Свет видел много любительск…
  2. Jul 14, 2024Интересный пример, когда объявление friend T (где T — шаблонный параметр) имеет смысл: tem…
  3. Jun 2, 2024#обсуждение Вечернее обсуждение. Пост от @eoanermine Кажется, будто C++ идёт не в том напр…
  4. Mar 1, 2024Спасибо всем зарегистрировавшимся, и до скорой встречи! Нам хотелось бы собрать как можно…
  5. Feb 27, 202420 марта: C++ митап в Петербурге и онлайне Нас ждет классический вечерний бесплатный митап…
  6. Feb 27, 2024Пока мы проводим митапы в Москве, наши коллеги из YADRO планируют митап в Санкт–Петербурге…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →