Gcc 是G++;5.1';s`-Wctor dtor privacy`警告是否已损坏?

Gcc 是G++;5.1';s`-Wctor dtor privacy`警告是否已损坏?,gcc,g++,clang++,gcc-warning,g++5.1,Gcc,G++,Clang++,Gcc Warning,G++5.1,或隐私警告将在以下情况下触发: 因此,对于以下类,我希望触发警告: 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或隐私时都不会对此代码发出警告。这似乎有点可疑,但警告并不完美,所以我想可能会出现一些错误的否定。(可能不会

或隐私
警告将在以下情况下触发:

因此,对于以下类,我希望触发警告:

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或隐私时都不会对此代码发出警告。这似乎有点可疑,但警告并不完美,所以我想可能会出现一些错误的否定。(可能不会触发警告,因为复制和移动构造函数仍然是隐式定义的,所以从技术上讲,并不是所有构造函数都是私有的——即使类仍然无法构造。)

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

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隐私的警告:

class ReallyTrulyPrivateOnly
{
  private:
    ReallyTrulyPrivateOnly(void) =default;
    ReallyTrulyPrivateOnly(ReallyTrulyPrivateOnly&&) =default;
    ReallyTrulyPrivateOnly(const ReallyTrulyPrivateOnly&) =default;
  public:
    void foo(void) {}
};
所以,也许这个警告只是为了G++命令行兼容性而提供的,但实际上什么都不做?(注意,这个类使用GCC生成了一个非常合理的警告:
警告:“class reallytrullyprovateonly”只定义私有构造函数,没有朋友[-Wctor dtor privacy]

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


编辑3:上述编辑中的错误不是同一问题;我为这个问题打开了一个窗口。

-Wctor dtor privacy
显然用词不当。当所有(显式声明的)成员函数都是私有函数时,g++发出警告,而不仅仅是CTOR和DTOR。@n.m.实际上,我错误地键入了
ReallyPrivateOnly
示例:
仅定义私有构造函数
g++警告仅在
foo
public
时发出。当
foo
private
时,我会得到原始的
所有成员函数…都是private
消息…因此…我想这确实是两个警告:一个警告指示您无法实际构造类,其中一个指示类具有不可调用的成员。clang实际上只接受此警告标志以实现gcc兼容性,而不发出警告。