タグ付けされた質問 「most-vexing-parse」

2
変数を宣言するときに、C ++で変数名を括弧で囲むことができるのはなぜですか?
たとえば、次のような宣言: int (x) = 0; またはそれでも: int (((x))) = 0; 私のコードに次のようなフラグメントがあったため、これに遭遇しました。 struct B { }; struct C { C (B *) {} void f () {}; }; int main() { B *y; C (y); } 明らかにC、デストラクタで役立つ何かを実行するオブジェクトを作成したかったのです。ただし、コンパイラは型C (y);を使用した変数の宣言として処理するため、再定義に関するエラーが出力されます。興味深いのは、私がそれをそのように、またはそのようなものとして書くと、意図したとおりにコンパイルされるということです。もちろん、最新の最善の回避策は、コンストラクター呼び出しで使用することです。yCyC (y).f ()C (static_cast<B*> (y)){} そのため、後で理解したように、int (x) = 0;またはのような変数を宣言することは可能ですが、int (((x))) = 0;実際にこのような宣言を使用している人を見たことがありません。だから私は興味があります-今のところ、それは悪名高い「最も厄介な解析」に似たケースを作成するだけで、有用なものは何も追加しないので、そのような可能性の目的は何ですか?


3
なぜこれがデフォルトのコンストラクターを呼び出すのですか?
struct X { X() { std::cout << "X()\n"; } X(int) { std::cout << "X(int)\n"; } }; const int answer = 42; int main() { X(answer); } 私はこれがどちらかを印刷することを期待していました X(int)、X(answer);からintへのキャストとして解釈される可能性があるためX、または X(answer);変数の宣言として解釈される可能性があるため、何もありません。 ただし、それは出力されX()、なぜX(answer);デフォルトのコンストラクターを呼び出すのかわかりません。 ボーナスポイント:変数宣言ではなく一時宣言を取得するには、何を変更する必要がありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.