ぷろみん

プログラミング的な内容を扱ってます

privateコンストラクタじゃなくてDefaulted and Deleted Functionsを使おう

概要

参考
Explicitly Defaulted and Deleted Functions

privateコンストラクタによるコピー不可クラスにはいくつかの問題があります。

コピーコンストラクタをprivateにするとコンストラクタが必要になる

struct NonCopyable
{
    // 何もしない場合でもコンストラクタを明示的に宣言する必要がある。
    NonCopyable() {};
  
private:
    NonCopyable(const NonCopyable&);
    NonCopyable& operator=(const NonCopyable&);
};

空のコンストラクタとデフォルトコンストラクタでは挙動が違う

詳しくは過去記事を参照してください。
C++の初期化は分かりにくい - ぷろみん

簡単に説明すると、空のコンストラクタはメンバの値が不定値になりやすいという事です。

メンバ関数やfriend関数はprivateコピーコンストラクタにアクセスできてしまう

参照した場合宣言のみの関数なのでエラーとなってしまいます。

意図が明確では無い

privateのコピーコンストラクタの挙動を把握している人の間でしか理解できない記述はよろしくないです。

C++11のDefaulted and Deleted Functionsを使おう

struct NonCopyable
{
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;
};