Подтвердить что ты не робот

Какова цель объявления типа int (x); или int (x) = 10;

Если вы посмотрите на грамматику для *declarator*s in §8/4, вы заметите, что a 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';
}

Но в чем заключается назначение разрешать эти круглые скобки, когда указатель (на массив или на функцию) не участвует в объявлении?

4b9b3361

Ответ 1

Тот факт, что это правило применимо в вашем случае, не является преднамеренным: в конечном итоге результат сохранения простой грамматики. Нет никакого стимула запрещать такие заявления, как ваши, но есть большие препятствия для усложнения правил, особенно если они сложны, как они.

Короче говоря, если вы не хотите использовать этот бесполезно запутанный синтаксис, не делайте этого.  С++ редко заставляет вас писать читаемый код.

Удивительно, но есть сценарии, в которых круглые скобки могут сохранить день:

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

Ответ 2

Вы задаете неправильный вопрос. Правильный вопрос:

В чем заключается цель отказа от такого объявления?

Ответ: нет.

Итак, учитывая, что этот синтаксис разрешен как побочный эффект правил в другом месте, это то, что вы получаете.