当我回答这个问题时,出现了这个问题:标准是否允许并对friend标准库类和/或函数做出任何保证?
在这种特殊情况下,问题是的情况是:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
Run Code Online (Sandbox Code Playgroud)
保证允许MyUserDefinedType存储在具有默认删除器的对象std::unique_ptr<MyUserDefinedType>或std::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