3

このctor-dtor-privacy警告は、すべてのコンストラクタとデストラクタが private である場合にトリガーされることを意図しています。

したがって、次のクラスでは、警告がトリガーされると予想されます。

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++警告を与えません。

暗黙の public コンストラクターがあるため、この警告は確かに正しくないようです。何が起きてる?これはバグですか?

編集:おそらく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:この警告の動作は十分に理解されておらず、文書化されておらず、この問題は発見され、バグ 55813で報告されていると思います。これはリリース 4.8 で「修正済み」とマークされましたが、動作がまだ怪しいと思われるため、この質問を指摘するコメントを追加しました。

EDIT 3:上記の編集のバグは同じ問題ではありません。この問題について、新しいバグ レポート (71484)を作成しました。

4

0 に答える 0