我回答的时候就出现了这个问题这个问题 https://stackoverflow.com/questions/15193108/c-unique-ptr-versus-friend-class-private-destructor/15193179:标准是否允许并做出任何保证friend
- 标准库类和/或函数?
在这种特殊情况下,问题是:
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
保证允许MyUserDefinedType
要存储在std::unique_ptr<MyUserDefinedType>
or std::shared_ptr<MyUserDefinedType>
具有默认删除器的对象。
一般来说,标准库中描述的类是否需要直接实现其功能,或者它们是否可以使用任意级别的间接?例如,是否有可能
-
std::default_delete<MyUserDefinedType>
实际上是一个using
内部命名空间中定义的类的别名std
,在这种情况下friend
声明将是非法的
or
-
std::default_delete<MyUserDefinedType>
调用其他一些实际执行删除操作的类,在这种情况下friend
声明不会达到预期的效果
或者其他类似的东西?
My guess is that this is UB not guaranteed to work but I am curious if this is addressed specifically by the standard.
上面给出的这个具体示例适用于 clang trunk (w/libc++) 和 GCC 4.7.2 (w/libstdc++),FWIW
有没有可能std::default_delete<MyUserDefinedType>
实际上是在 std 的内部命名空间中定义的类的 using 别名,在这种情况下,友元声明将是非法的?
No。根据 C++11 标准第 20.7.1.1.2 段:
namespace std {
template <class T> struct default_delete {
constexpr default_delete() noexcept = default;
template <class U> default_delete(const default_delete<U>&) noexcept;
void operator()(T*) const;
};
}
事实上它必须是一个类模板是明确指定的。这意味着它不能是别名模板。如果真是这样的话,那也不可能专精。
有没有可能std::default_delete<MyUserDefinedType>
调用实际执行删除操作的其他类,在这种情况下,友元声明不会达到预期的效果?
Yes.标准中没有任何内容指定该调用不能由某些内部帮助程序完成。根据第 20.1.1.2 段:
void operator()(T *ptr) const;
3 效果:调用delete
on ptr
.
4 备注:如果T
是不完整类型,程序格式错误。
这仅指定了effect调用呼叫操作员default_delete<>
函子应该是,而不是how这应该具体实现(无论是直接在调用运算符的体内,还是通过将任务委托给其他类的某个成员函数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)