相关疑难解决方法(0)

在std命名空间中定义的朋友类:任何保证?

当我回答这个问题时,出现了这个问题:标准是否允许并对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

c++ std language-lawyer

5
推荐指数
1
解决办法
279
查看次数

标签 统计

c++ ×1

language-lawyer ×1

std ×1