Этот вопрос возник, как я ответил this question: позволяет ли стандарт разрешать и делать какие-либо гарантии относительно friend
-учет стандартных классов библиотек и/или функций?Дружественные классы, определенные в пространстве имен std: любые гарантии?
В данном конкретном случае, ситуация вопрос, был ли:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
гарантированно позволит MyUserDefinedType
хранить в std::unique_ptr<MyUserDefinedType>
или std::shared_ptr<MyUserDefinedType>
объекта с Deleter по умолчанию.
В общем, классы, описанные в стандартной библиотеке, необходимые для реализации их функциональности напрямую или могут использовать любой произвольный уровень косвенности? Например, это возможно, что
std::default_delete<MyUserDefinedType>
на самом деле являетсяusing
псевдоним класса, определенного во внутреннем пространстве именstd
, и в этом случаеfriend
декларация будет незаконно
или
std::default_delete<MyUserDefinedType>
вызывает некоторый другой класс, который фактически выполняет удаление, и в этом случае объявлениеfriend
не будет иметь желаемого ef fect
или что-то еще вдоль этих линий?
Моя догадка заключается в том, что это UB не гарантированно работает, но мне любопытно, относится ли это конкретно к стандарту.
Этот конкретный пример, приведенный выше работ по стволу Clang (ж/LibC++) и GCC 4.7.2 (ж/libstdC++), FWIW
Я не знаю ответа, но «подружиться» 'std :: default_delete <>' будет, если он работает, позволяет почти любому вызвать деструктор класса. Это заставляет меня задаться вопросом, почему сделать деструктор приватным в первую очередь, если затем используется объявление друга, которое делает его (почти) общедоступным. (По общему признанию, это все равно означает, что объекты автоматического хранилища не могут быть выделены.) – jogojapan
Я бы не ожидал, что это будет правда (хотя я прекратил быть экспертом на C++ десять лет назад); экспериментально, похоже, это не относится к последним g ++ и vC++, FWIW. –
Я не думал, что решение было хорошим, я предложил реализовать новый deleter –