この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)を作成しました。