ホームページ > バックエンド開発 > C++ > 直接初期化構文を使用して C でクラス データ メンバーを初期化できないのはなぜですか?

直接初期化構文を使用して C でクラス データ メンバーを初期化できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-17 16:10:02
オリジナル
304 人が閲覧しました

Why can't I initialize class data members in C   using direct initialization syntax?

C では直接構文によるクラス データ メンバーの初期化が禁止されている理由

プログラマは、なぜローカルな方法と同様に、直接初期化構文を使用してクラス データ メンバーに値を割り当てることができないのか疑問に思うかもしれません。変数は可能です。次の例を考えてみましょう:

class test
{
    public:
        void fun()
        {
            int a(3);
            std::cout << a << '\n';
        }
    private:
        int s(3);    // Compiler error: Why???
};
ログイン後にコピー

このコードをコンパイルすると、エラーが発生します:

11    9 [Error] expected identifier before numeric constant
11    9 [Error] expected ',' or '...' before numeric constant
ログイン後にコピー

なぜこれが起こるのでしょうか?クラス データ メンバーの初期化に関する C 標準のスタンスを確認してみましょう。

解析の曖昧さ

直接初期化構文の初期の提案では、解析の問題を防ぐために除外されたと説明されていました。たとえば、次のコードを考えてみましょう。

struct S {
    int i(x); // data member with initializer
    // ...
    static int x;
};

struct T {
    int i(x); // member function declaration
    // ...
    typedef int x;
};
ログイン後にコピー

直接初期化が許可されている場合、struct S の宣言の解析があいまいになります。コンパイラは int i(x) を解釈できます。初期化子を持つデータ メンバーとして、またはパラメーターを持つメンバー関数宣言として。

既存の解決ルール

1 つの解決策は、宣言が両方とも解釈できるかどうかというルールに依存することです。オブジェクトと関数の場合、関数として扱う必要があります。ただし、このルールはブロック スコープの宣言に対してすでに存在しており、潜在的な混乱につながります。

struct S {
    int i(j); // ill-formed...parsed as a member function,
              // type j looked up but not found
    // ...
    static int j;
};
ログイン後にコピー

別の解決策は、宣言が型と他のものの両方として解釈できる場合は、宣言を型として解釈する必要があるというルールを使用することです。後者として扱われます。繰り返しになりますが、このルールはテンプレートに対してすでに存在しています:

struct S {
    int i(x); // unabmiguously a data member
    int j(typename y); // unabmiguously a member function
};
ログイン後にコピー

ただし、これらのソリューションはどちらも誤解を招きやすい微妙な点をもたらします。

提案されたソリューション

これらの曖昧さに対処するには、 C 標準では、次の形式の初期化子のみを許可することが提案されています:

  • = Initializer-clause
  • {Initializer-list }

これにより、ほとんどの場合のあいまいさが解決され、追加のルールの必要性が回避されます。

要約すると、 C のクラス データ メンバーの直接初期化構文は、両方のデータ メンバーが関与する複雑なデータ構造の宣言中に発生する可能性のある解析のあいまいさに起因します。および同様のシグネチャを持つ関数宣言または型定義。

以上が直接初期化構文を使用して C でクラス データ メンバーを初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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