C でプライベートのデフォルト コンストラクターを暗黙的に呼び出すことができるのはなぜですか?

Susan Sarandon
リリース: 2024-11-12 04:30:02
オリジナル
954 人が閲覧しました

Why Can a Private Default Constructor Be Implicitly Invoked in C  ?

プライベート コンストラクターがプライベート コンストラクターではない場合は何ですか?

C では、デフォルトのコンストラクターを private と宣言することが、プライベート コンストラクターを防ぐ簡単な方法のように思えるかもしれません。オブジェクトのインスタンス化。ただし、驚くべきことに、プライベートのデフォルト コンストラクターは依然として暗黙的に呼び出すことができます。

質問:

次のコードを考えてみましょう:

class C {
    C() = default;
};

int main() {
    C c; // error: default constructor private
    auto c2 = C(); // error: default constructor private
}
ログイン後にコピー

なぜコンストラクターはプライベートであるように見えますが、中括弧を使用して暗黙的に呼び出すことができます初期化?

答え:

鍵は C 14 仕様にあります。ユーザー提供のコンストラクターは、デフォルトまたは削除されずに明示的に宣言されたコンストラクターです。 C のデフォルト コンストラクターは最初の宣言で明示的にデフォルト設定されているため、ユーザー提供とみなされません。

その結果、C にはユーザー提供のコンストラクターが欠如し、集合体になります (8.5.1/1 によると)。仕様。集約は、プライベートまたは保護された非静的データ メンバー、基本クラス、仮想関数、およびユーザー提供のコンストラクターを持たないクラスとして定義されます。これは、デフォルトのコンストラクターが技術的にプライベートであるにもかかわらず、中括弧の初期化で C のオブジェクトを正常に作成できる理由を説明しています。

以上がC でプライベートのデフォルト コンストラクターを暗黙的に呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート