5

タイトルは、マーシャル・クラインによる有名なサイトC++FAQに由来しています。

著者は、次の2つのコード例には違いがあると主張しています。

Listがクラスの名前であるとします。次に、関数f()はxと呼ばれるローカルListオブジェクトを宣言します。

void f()
{
    List x;     // Local object named x (of class List)
    ...
}

ただし、関数g()は、リストを返すx()という関数を宣言します。

void g()
{
    List x();   // Function named x (that returns a List)
    ...
}

しかし、2番目のバリアントを使用するのは本当に間違っていますか?

そして、それが本当に宣言である場合、コンパイラは、関数内で関数を宣言できないと文句を言うのではないでしょうか。

4

1 に答える 1

7

そして、それが本当に宣言である場合、コンパイラは、関数内で関数を宣言できないと文句を言うことはありません。

もちろん違います。関数を使って関数を宣言できるからです。

これは最も厄介な解析と呼ばれ、十分に文書化されています。実際、コンパイラに代わって処理するのはエラーになります

List x();

変数宣言として。

しかし、2番目のバリアントを使用するのは本当に間違っていますか?

変数が必要な場合は、はい。関数を宣言したいのなら...ちょっとそうです。できますが、通常は関数スコープの外で行います。

于 2012-09-06T09:31:58.620 に答える