16

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理由には答えません。=defaultprivate

 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

4

1 に答える 1

15

これは gcc のバグです。バグ 57913には、あなたのものとほぼ同じ例が含まれています。バグ 56429には、いくつかの関連するバグ レポートへのリンクが含まれています。バグ 54​​812は gcc 4.9 で修正されており、実際にコードを拒否しています。

error: 'constexpr A::A()' is private

ライブデモ

于 2015-10-16T21:59:58.030 に答える