3

所有构造函数和析构函数都是 privatector-dtor-privacy时,将触发警告。

因此,对于以下课程,我希望会触发警告:

struct foo
{
  public:
    static int test(void) { return 3; };
  private:
    foo(void) {}
};

但是clang++(版本clang 3.7.0 (trunk 238948))和 GCC 5.1.0 在使用-Wctor-dtor-privacy. 这看起来很可疑,但警告并不完美,所以我想会出现一些误报。(也许警告不会被触发,因为复制和移动构造函数仍然是隐式定义的,所以技术上并不是所有的构造函数都是私有的——即使类仍然不能被构造。)

但是,此代码确实收到警告:

struct foo
{
  private:
    static int test(void) { return 3; };
  // private:
  //   foo(void) {}
};

在这里,test创建private并删除了显式构造函数,以便foo隐式定义 ' 构造函数。G++ 给出以下警告:

 warning: all member functions in class ‘foo’ are private [-Wctor-dtor-privacy]

clang++没有警告。

这个警告肯定看起来不正确,因为有一个隐式的公共构造函数。这里发生了什么?这是一个错误吗?

编辑:似乎 Clang++从未发出警告。即使以下类也不会触发任何警告-Wctor-dtor-privacy

class ReallyTrulyPrivateOnly
{
  private:
    ReallyTrulyPrivateOnly(void) =default;
    ReallyTrulyPrivateOnly(ReallyTrulyPrivateOnly&&) =default;
    ReallyTrulyPrivateOnly(const ReallyTrulyPrivateOnly&) =default;
  public:
    void foo(void) {}
};

所以也许这个警告只是为了 G++ 命令行兼容性而提供的,但实际上什么也没做?(请注意,此类使用 GCC 会生成一个非常明智的警告warning: ‘class ReallyTrulyPrivateOnly’ only defines private constructors and has no friends [-Wctor-dtor-privacy]:)

编辑 2:我相信这个警告的行为没有得到很好的理解或记录,并且这个问题在bug 55813中被注意到和报告。这在 4.8 版中被标记为“已修复”,但由于这种行为对我来说仍然是可疑的,所以我添加了一条指向这个问题的评论。

编辑3:上述编辑中的错误不是同一个问题;我为此问题打开了一个新的错误报告 (71484) 。

4

0 回答 0