Почему `polymorphic_allocator` принимает указатель` memory_resource`, а не ссылку? - PullRequest
10 голосов
/ 07 мая 2019

Стандарт C ++ 17 гласит:

[mem.poly.allocator.ctor]

polymorphic_allocator(memory_resource* r);
  • Требуется: r не равно нулю.

  • Эффекты: Устанавливает memory_­rsrc в r.

  • Броски: Ничего.

  • [ Примечание: Этот конструктор обеспечивает неявное преобразование из memory_­resource*.- конечная нота ]

Какой смысл принимать memory_resource* вместо memory_resource&, если "требует" В предложении упоминается, что r должно быть ненулевым?

Руководство по стилю Bloomberg¹ рекомендует принимать аргументы, которые будут видоизменяться указателем, а не ссылкой, так что амперсанд на стороне вызывающего становится визуальным маркером длямутации.Однако в Стандарте такого прецедента нет.

По какой причине r принимается за указатель, а не за ссылку?


¹ pmr был стандартизирован при активном участии Bloomberg, так как компания использует модель полиморфного распределителя.

1 Ответ

7 голосов
/ 07 мая 2019

N3916 :

Обратите внимание, что библиотека ресурсов памяти спроектирована так, что конструктор ShoppingList принимает указатель на memory_resourceвместо ссылка на memory_resource.Было отмечено, что одной из распространенных практик является использование ссылок, а не указателей в ситуациях, когда нулевой указатель находится вне контракта.Однако существует более убедительная практика избегать конструкторов, которые берут объекты по ссылке и сохраняют их адреса.Мы также хотим избежать передачи неконстантных ссылок, поскольку это тоже обычно считается плохой практикой (за исключением перегруженных операторов).

...