friend
关键字去友元化标准库类和/或函数?在这个特定情况下,问题是:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
保证将MyUserDefinedType
存储在默认删除器的std::unique_ptr<MyUserDefinedType>
或std::shared_ptr<MyUserDefinedType>
对象中。
一般来说,标准库中描述的类是否需要直接实现其功能,还是可以使用任意级别的间接方式?例如,是否可能:
std::default_delete<MyUserDefinedType>
实际上是定义在std
的内部命名空间中的一个类的using
别名,这种情况下friend
声明将是非法的?
或者
std::default_delete<MyUserDefinedType>
调用另一个实际执行删除操作的类,这种情况下friend
声明将不会产生预期的效果?
或者其他类似情况?
我的猜测是,这并不能保证工作,但我想知道标准是否具体规定了这一点。
对于所给出的上述特定示例,在 clang trunk (w/libc++) 和 GCC 4.7.2 (w/libstdc++) 上都能工作。
std::default_delete<>
交朋友”可以让几乎任何人调用类的析构函数,如果它起作用的话。这让我想知道为什么首先将析构函数设为私有,然后使用友元声明使其(几乎)再次变为公共。 (不过,必须承认,这仍然意味着自动存储的对象无法被释放。) - jogojapanMyUserDefinedTypeImpl
作为MyUserDefinedType
的实现,则在理论上允许MyUserDefinedTypeImpl
同时与MyUserDefinedType
和std::default_delete<MyUserDefinedTypeImpl>
建立友好关系可能是有意义的,以提供私有继承的保护性和公共析构函数的清晰性。当然,这仍然不是理想的解决方案,但至少存在一个理论上的用例。 - Justin Time - Reinstate Monica