Если вы посмотрите на грамматику для *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à!
};
}
Вы задаете не тот вопрос. Правильный вопрос:
Какова цель запрета такой декларации?
Ответ: здесь ничего нет.
Итак, учитывая, что этот синтаксис разрешен как побочный эффект правил в другом месте, это то, что вы получаете.