Qual è lo scopo di una dichiarazione come int (x); o int (x) = 10;

Se osservate la grammatica per *declarator*s in §8/4 noterete che un noptr-declarator può essere scritto come ( ptr-declarator ), cioè, può essere scritto come ( declarator-id ), che convalida dichiarazioni come quelle nel titolo. Di fatto questo codice viene compilato senza problemi:

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

Ma qual è lo scopo di consentire queste parentesi quando un puntatore (in una matrice o in una funzione) non è coinvolto nella dichiarazione?

Il fatto che questa regola sia applicabile nel tuo caso non è intenzionale: in definitiva è il risultato del semplice mantenimento della grammatica . Non vi è alcun incentivo a vietare dichiarazioni come la vostra, ma ci sono grandi disincentivi a complicare le regole, specialmente se sono intricate come sono.

In breve, se non vuoi usare questa syntax inutilmente offuscata, non farlo.
C ++ raramente ti costringe a scrivere codice leggibile.

Sorprendentemente ci sono scenari in cui le parentesi possono salvare la giornata, però:

 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à! }; } 

Stai facendo la domanda sbagliata. La domanda corretta è:

Qual è lo scopo di non autorizzare una simile dichiarazione?

La risposta è: non ce n’è .

Quindi, dato che questa syntax è consentita come un effetto collaterale delle regole altrove, questo è ciò che ottieni.