5

重複の可能性:
最も厄介な解析: A が a(()); でない理由 仕事?

今回は何かを学ぼうとして、CSの学位をもう一度やり直したいという単純なC ++の問題があります。;)

このコードがコンパイルされない理由:

vector<int> v(int());
v.push_back(1);

この他のものは単一の警告なしでコンパイルされます

vector<int> v((int()));
v.push_back(1);

違いを見つけるのはさらに困難です (余分な括弧が追加されました:P)。

4

2 に答える 2

9

これは、最も厄介な解析と呼ばれます。

vector<int> v(int());

v関数を取り ( を返すパラメータを取らないint)、 を返す関数を宣言しますvector<int>これは、関数へのポインタをv取り( を返すパラメータを取らない)、 を返す関数に自動的に「調整」されます。intvector<int>

関数宣言のパラメーター宣言子の周りに余分な括弧を配置することはできないため、余分な括弧のペアはこの解釈を抑制し(int())、 という名前のオブジェクトの初期化子としてのみ解釈できますv

C++ には、int()シンタックス上 (必ずしもセマンティックではない) 意味がある場合、式ではなく宣言子として物事 (この場合は ) を解析することを好む明示的な曖昧さ回避規則があります。

于 2012-01-24T13:38:04.313 に答える