当我回答这个问题时出现了这个问题:标准是否允许并保证friend
-ing 标准库类和/或函数?
在这种特殊情况下,问题是:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
保证允许使用默认删除器MyUserDefinedType
存储在std::unique_ptr<MyUserDefinedType>
orstd::shared_ptr<MyUserDefinedType>
对象中。
一般来说,标准库中描述的类是否需要直接实现其功能,或者它们可以使用任意级别的间接?例如,是否有可能
std::default_delete<MyUserDefinedType>
实际上是using
在 的内部命名空间中定义的类的别名std
,在这种情况下,friend
声明将是非法的
或者
std::default_delete<MyUserDefinedType>
调用其他一些实际执行删除的类,在这种情况下,friend
声明不会产生预期的效果
或其他类似的东西?
我的猜测是,这不能保证UB可以正常工作,但我很好奇这个标准是否专门解决了这个问题。
上面给出的这个具体示例适用于 clang trunk (w/libc++) 和 GCC 4.7.2 (w/libstdc++), FWIW