web-dev-qa-db-ja.com

int(x)のような宣言の目的は何ですか。またはint(x)= 10;

*declarator*s in §8/4の文法を見ると、noptr-declaratorは(ptr-declarator)、つまり、(declarator-id)、タイトルのような宣言を検証します。実際のところ、このコードは問題なくコンパイルされます。

#include <iostream>
struct A{ int i;};
int (x) = 100;
A (a) = {2};
int main()
{
    std::cout << x << '\n';
    std::cout << a.i << '\n';
}

しかし、これらの括弧を許可する目的は何ですか(配列または関数への)ポインタが宣言に含まれていない場合?

38
Mao

このルールがあなたのケースに適用できるという事実は故意ではありません:それは最終的に文法をシンプルに保つことの結果です。あなたのような宣言を禁止するインセンティブはありませんが、特にそれらが複雑である場合は、ルールを複雑にする大きな阻害要因があります。

要するに、この不必要に難読化された構文を使用したくない場合は、使用しないでください。
C++が読み取り可能なコードの記述を強制することはほとんどありません。

驚いたことに、括弧で日を節約できるシナリオがあります。

std::string foo();

namespace detail
{
    int foo(long); // Another foo

    struct Bar
    {
        friend std::string ::foo(); // Doesn't compile for obvious reasons.

        friend std::string (::foo)(); // Voilà!
    };
}
52
Columbo

あなたは間違った質問をしています。正しい質問は次のとおりです。

そのような宣言を拒否する目的は何ですか?

答えはありませんです。

したがって、この構文が他の場所でのルールの副作用として許可されている場合、これはあなたが得るものです。