[解決済み] 値の初期化を試みたが、関数宣言と解釈された。A a(()); で解決しないのはなぜか?
質問
Stack Overflow が教えてくれた多くのことの中に、いわゆる "most vexing parse" と呼ばれる、古典的に次のような行で示されるものがあります。
A a(B()); //declares a function
これは、直感的にはオブジェクトの宣言のように見えますが
a
型の
A
を取得し、一時的に
B
オブジェクトをコンストラクタのパラメータとして指定するもので、実際には関数の宣言です。
a
を返す
A
を返す関数へのポインタを取る。
B
であり、それ自身はパラメータを取らない。同様に
A a(); //declares a function
も同じカテゴリーに属しますが、これはオブジェクトの代わりに関数を宣言しているからです。さて、最初のケースでは、この問題を回避するために、通常は
B()
コンパイラはこれをオブジェクトの宣言として解釈します。
A a((B())); //declares an object
しかし、2番目のケースでは、同じようにすると、コンパイルエラーになります
A a(()); //compile error
質問ですが、なぜですか?そうです、正しい「回避策」はこれを
A a;
しかし、私は、この余分な
()
は、最初の例ではコンパイラのために働いていましたが、2番目の例でそれを再適用すると、働かなくなります。この
A a((B()));
を回避する方法は、標準に書かれている特定の例外なのでしょうか?
解決方法は?
C++言語で有効な構文として定義されていないだけなので、賢明な答えはないのですが...。 つまり、言語の定義上、そうなっているのです。
もし、その中に式があるのなら、それは有効です。 例えば
((0));//compiles
もっと簡単に言うと、なぜなら
(x)
は有効な C++ 式であるのに対し
()
はありません。
言語がどのように定義され、コンパイラがどのように動作するかについて詳しく知るには 形式言語理論 またはもっと具体的に 文脈自由文法(Context Free Grammars、CFG) と有限状態機械などの関連資料があります。 もし興味があるなら、wikipediaのページだけでは不十分で、本を買わなければならないでしょう。
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件