确定 C++ 类是不是具有私有析构函数

Posted

技术标签:

【中文标题】确定 C++ 类是不是具有私有析构函数【英文标题】:Determining whether a C++ class has a private destructor确定 C++ 类是否具有私有析构函数 【发布时间】:2014-10-08 15:37:18 【问题描述】:

假设我有以下代码:

class Example

#ifndef PRIVATE_DESTRUCTOR
public:
#endif
    ~Example()  
public:
    friend class Friend;
;

class Friend

public:
    void Member();
;

void Friend::Member()

    std::printf("Example's destructor is %s.\n",
        IsDestructorPrivate<Example>::value ? "private" : "public");

是否可以实现上面的IsDestructorPrivate模板来判断一个类的析构函数是private还是protected

在我正在使用的情况下,我需要使用此IsDestructorPrivate 的唯一时间是在可以访问此类私有析构函数(如果存在)的地方。它不一定存在。 IsDestructorPrivate 可以是宏而不是模板(或解析为模板的宏)。 C++11 很好。

【问题讨论】:

为什么要创建私有析构函数? AFAIK 无法检查可访问性。理想情况下,您不应该编写依赖于此的代码。 @mohaned 可能有类似单身的行为? @mohaned 这里是一个更好的答案:***.com/q/631783/3093378 @mohaned - why would you create private destructor? 这样您就可以控制客户端如何创建/销毁您的类的实例。 【参考方案1】:

您可以使用std::is_destructible 类型特征,如下例所示:

#include <iostream>
#include <type_traits>

class Foo 
  ~Foo() 
;

int main() 
  std::cout << std::boolalpha << std::is_destructible<Foo>::value << std::endl;

LIVE DEMO

如果T 的析构函数是deletedprivatetrue,则std::is_destructible&lt;T&gt;::value 将等于false

【讨论】:

该死的。这在 Visual Studio 2010 中不存在,plain 在 Visual Studio 2013 中不起作用。connect.microsoft.com/VisualStudio/feedback/details/811436/… 此外,标准似乎不清楚 std::is_destructible 实际上是否应该为私有/受保护的析构函数返回 false。 @Myria 您已经发现 Visual Studio 在使用 std::is_destructible 类型特征时存在问题。恕我直言,我认为标准很明确,如果析构函数不可访问,std::is_destructible&lt;T&gt;::value 将返回 false,因为它要求 表达式std::declval&lt;U&amp;&gt;().˜U() 在被视为未评估的操作数时格式正确,其中在~U() 的情况下是无法访问的。或者,在 Visual Studio 中,您可以使用 boost 来克服这个错误功能。 在发布之前,我检查了标准的 Git 存储库副本;该措辞不清楚。我没有看到任何指定“在哪个上下文中”检查表达式的格式良好的内容。 std::declval&lt;U&amp;&gt;().~U()class Ufriend 范围内格式正确。例如,pastebin.com/j3BvWkcm 如果一个表达式不会使程序定义不正确,那么它就是定义好的。为此,如果表达式std::declval&lt;U&amp;&gt;().~U()U 的析构函数可访问的上下文中求值(例如,U 的成员函数、U 的声明friend 等),那么它是格式良好的并将被评估为void。如果在 U 的析构函数不可访问的上下文中对其进行评估,则表达式格式错误,因为程序无法编译。类型特征使用 SFINAE。也就是说,如果std::is_destructible&lt;T&gt;::valueT 的析构函数不可访问的上下文中进行评估...

以上是关于确定 C++ 类是不是具有私有析构函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 析构函数:无法访问类中声明的私有成员

特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?

受保护的与私有的析构函数

用C++设计一个不能被继承的类(转)

c++ 析构函数 是在啥时候执行

为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数