プログラマは、なぜローカルな方法と同様に、直接初期化構文を使用してクラス データ メンバーに値を割り当てることができないのか疑問に思うかもしれません。変数は可能です。次の例を考えてみましょう:
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 標準では、次の形式の初期化子のみを許可することが提案されています:
これにより、ほとんどの場合のあいまいさが解決され、追加のルールの必要性が回避されます。
要約すると、 C のクラス データ メンバーの直接初期化構文は、両方のデータ メンバーが関与する複雑なデータ構造の宣言中に発生する可能性のある解析のあいまいさに起因します。および同様のシグネチャを持つ関数宣言または型定義。
以上が直接初期化構文を使用して C でクラス データ メンバーを初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。