util.smartptr.shared.const / 9 в C ++ 11:
Ефекти: Конструює об'єкт shared_ptr, який належить об'єкту p та делетору d. Другий і четвертий конструктори повинні використовувати копію а, щоб виділити пам'ять для внутрішнього використання.
Другий і четвертий конструктори мають такі прототипи:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
В останньому проекті util.smartptr.shared.const / 10 еквівалентно нашій меті:
Ефекти: Конструює об'єкт shared_ptr, який належить об'єкту p та делетору d. Якщо T не тип масиву, перший і другий конструктори включають спільний_з_ це з p. Другий і четвертий конструктори повинні використовувати копію а, щоб виділити пам'ять для внутрішнього використання. Якщо викинутий виняток, називається d (p).
Отже, розподільник використовується, якщо є необхідність виділити його у виділеній пам'яті. Виходячи з діючого стандарту та відповідних звітів про дефекти, розподіл не є обов'язковим, але передбачається комітетом.
Хоча інтерфейс shared_ptr
дозволяє реалізовувати там, де ніколи не існує керуючого блоку, а всі shared_ptr
і weak_ptr
містяться у зв'язаному списку, на практиці такої реалізації немає. Крім того, формулювання було змінено, передбачаючи, наприклад, що use_count
спільне використання.
Делетер зобов'язаний рухатись лише конструктивними. Таким чином, неможливо мати кілька примірників у shared_ptr
.
Можна уявити реалізацію, яка ставить делетер у спеціально розроблений shared_ptr
та переміщує його, коли shared_ptr
видаляється спеціальний . Хоча реалізація здається сумісною, вона також дивна, тим більше, що для підрахунку використання може знадобитися блок управління (можливо, але навіть більш дивно зробити те ж саме з кількістю використання).
Відповідні DR-файли, які я знайшов: 545 , 575 , 2434 (які підтверджують, що всі реалізації використовують блок управління і, здається, передбачають, що обмеження багатопотокових обмежень дещо наказує це), 2802 (що вимагає, щоб делетер рухався лише конструктивно, і таким чином перешкоджає виконанню, де делетер копіюється між декількома shared_ptr
's).