В чем смысл соглашения о присвоении имен `std :: unique_XXX`? - PullRequest
1 голос
/ 18 февраля 2020

Похоже, что в какой-то момент появился мини-тренд для названий вещей std::unique_XXX. Имеет смысл, что std::unique_ptr - это умный указатель, который должен обрабатываться только одним потребителем, и поэтому «уникальный» в этом случае имеет смысл.

Но по крайней мере еще один класс получил unique Моникер, и я не совсем уверен, почему. Почему std::unique_lock так называется? В отличие от std::lock_guard, который не является ни менее, ни более уникальным, верно?

Я думаю, что что-то упускаю.

Я не могу вспомнить, какие другие классы следовали этому примеру, но я кажется, помните, у нас есть больше. Может быть, это было просто std::unique_lock; Я забыл. Но если есть другие std::unique_XXX имена классов, почему они названы так?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Защитный замок блокируется при создании и разблокируется при уничтожении. Вы не можете переместить или скопировать его, поэтому вы не можете передавать или делиться доступом к заблокированному ресурсу.

A std::unique_lock является (среди прочего) подвижным (не копируемым). Таким образом, вы можете передать доступ к базовому ресурсу. Так же, как вы передаете право собственности на std::unique_ptr.

Хотя я не могу прокомментировать, почему была выбрана схема именования, поскольку меня там не было, и я не читал статьи / обсуждения по темам c ... сходство между ними, по крайней мере, достаточно очевидно, чтобы я мог сказать: «Да, я понимаю, почему они это сделали». :)

2 голосов
/ 18 февраля 2020

Вы упоминаете, что std::unique_ptr имеет смысл.

std::unique_lock смоделировано после boost::unique_lock. Вот предложение включить его в стандарт.

В статье, похоже, не упоминаются причины, стоящие за названием, но я собираюсь предположить , что префикс unique_ предназначен для обозначения типа, который:

  • Может быть «пустым»
  • Конструкции по умолчанию «пустые»
  • Может быть перемещен.
  • Может быть освобожден до уничтожения
  • Категорически запрещен обмен / копирование (существует std::shared_lock, который явно разрешает обмен)
...