private
デフォルトのコンストラクターが(4.8.1 g++)であるにもかかわらず、次のプログラムが正常にコンパイルされるのは非常に奇妙です。
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
実際には標準の 8.4.2[2] から (N3242)
明示的にデフォルト設定された関数は、暗黙的に constexpr として宣言されている場合にのみ、constexpr として宣言できます。最初の宣言で明示的にデフォルト設定されている場合、
— それは公開されなければならない。
..........
アクセス仕様を無視するデフォルト指定子の正確な目的は何ですか? これにより、ユーザーにデフォルト値を作成させたくないが、実装にデフォルトのコンストラクターが必要な、クラス デザイナーが保証しないインターフェイスの問題が発生する可能性があるように感じます。おそらく、デフォルトのコンストラクターが通常public
であり、それを複製することを目的としているためだと思いましたが、コピーコンストラクターが仕様を無視しないdefault
理由には答えません。=default
private
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
A b(a); //error: constexpr A::A(const A&) is private
}
copy/move
実際、明示的にデフォルト設定されたコンストラクター/割り当てが作成されていないことが言及されている標準からはわかりませんpublic
。