ホームページ >バックエンド開発 >C++ >C のプライベート デフォルト コンストラクターは、中括弧と一緒に使用すると機能するのに、括弧を使用すると失敗するのはなぜですか?

C のプライベート デフォルト コンストラクターは、中括弧と一緒に使用すると機能するのに、括弧を使用すると失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-11 14:00:03419ブラウズ

Why does a private default constructor in C   work when used with curly braces but fail with parentheses?

デフォルト コンストラクターのプライベート シャドウ

デフォルト コンストラクターをプライベートにする目的で型を宣言する場合、default キーワードを使用すると、次のコードに示すように、望ましい結果が得られます。スニペット:

class C {
    C() = default;
};

int main() {
    C c;           // error: C::C() is private within this context (g++)
                   // error: calling a private constructor of class 'C' (clang++)
                   // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC)
    auto c2 = C(); // error: as above
}

驚くべきことに、このコードはコンストラクターを明示的にプライベートにしているにもかかわらず、エラーを生成します。ただし、次のコードは正常にコンパイルされます。

class C {
    C() = default;
};

int main() {
    C c{};         // OK on all compilers
    auto c2 = C{}; // OK on all compilers
} 

中括弧を使用するとコンストラクターの動作が異なるのはなぜですか?

C 14 Default Constructor Defaultness

鍵は C 14 標準 (8.4.2/5) にあります[dcl.fct.def.default])、「ユーザー提供」関数を「ユーザーが宣言し、最初の宣言で明示的にデフォルト設定または削除されていない」関数として定義します。これは、この例のデフォルト コンストラクターが明示的にデフォルト設定されているため、ユーザー提供とみなされないことを意味します。

Aggregate Constructor Illumination

その結果、クラス C は次のようになります。ユーザーが提供するコンストラクターはありません。したがって、これは 8.5.1/1 [dcl.init.aggr] に従って集合体として分類され、集合体は「ユーザー提供のコンストラクター、プライベートまたは保護された非静的要素を持たない配列またはクラス」であると規定されています。データ メンバー、基本クラス、仮想関数はありません。"

を使用した集約構築中かっこ

集約には、プライベート コンストラクターがある場合でも中かっこ {} を使用して構築できる特別な構築ルールがあります。このルールは、通常は複数のメンバーを含む、配列や構造体などの集合体の初期化を簡素化することを目的としています。

したがって、クラス C のコンストラクターは、プライベートとしてマークされていても、中かっこ内で使用できます。クラス自体は集合体とみなされます。

以上がC のプライベート デフォルト コンストラクターは、中括弧と一緒に使用すると機能するのに、括弧を使用すると失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。