*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';
}
しかし、これらの括弧を許可する目的は何ですか(配列または関数への)ポインタが宣言に含まれていない場合?
このルールがあなたのケースに適用できるという事実は故意ではありません:それは最終的に文法をシンプルに保つことの結果です。あなたのような宣言を禁止するインセンティブはありませんが、特にそれらが複雑である場合は、ルールを複雑にする大きな阻害要因があります。
要するに、この不必要に難読化された構文を使用したくない場合は、使用しないでください。
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à!
};
}
あなたは間違った質問をしています。正しい質問は次のとおりです。
そのような宣言を拒否する目的は何ですか?
答えはありませんです。
したがって、この構文が他の場所でのルールの副作用として許可されている場合、これはあなたが得るものです。