Какова цель объявления типа 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

Решение

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

Короче говоря, если вы не хотите использовать этот излишне запутанный синтаксис, не делайте этого.
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

Другие решения

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

Какова цель запрета такой декларации?

Ответ: здесь ничего нет.

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

4

По вопросам рекламы [email protected]