Какая часть стандарта C ++ позволяет объявлять переменную в скобках?

Рассмотрим следующий код:

int main() { int(s); } 

Меня удивляет тот факт, что он создает допустимую переменную s . Может ли кто-нибудь объяснить, что здесь происходит?

2 Solutions collect form web for “Какая часть стандарта C ++ позволяет объявлять переменную в скобках?”

[dcl.meaning] в Стандарте говорит:

В объявлении TD где D имеет форму ( D1 ) тип содержащегося идентификатора-декларатора совпадает с типом содержащегося идентификатора declarator в объявлении T D1 .

Скобки не изменяют тип встроенного идентификатора declarator-id , но могут изменять привязку сложных деклараторов.

Более просто, вы можете помещать круглые скобки вокруг всего, что считается «декларатором» в грамматике C ++. (Говоря свободно, декларатор является частью декларации без начальных спецификаторов и типов, которые содержат одно имя.)

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

Причина этого, как подсказки второго цитируемого предложения, заключается в том, что это может быть необходимо, когда ситуация становится более сложной. Один пример:

 int * a [10]; // a is an array of ten pointers to int. int ( * b ) [10]; // b is a pointer to an array of ten ints. 

Просто чтобы добавить к другим ответам; в сводке грамматики для деклараторов (C ++ 14 [dcl.decl] / 4) вы можете найти:

 ptr-declarator: noptr-declarator noptr-declarator: ( ptr-declarator ) 

(Я пропустил другие подробности грамматики). Вы можете видеть из этого, что любой декларатор может быть заключен в круглые скобки, и он все равно будет соответствовать одному и тому же правилу грамматики.

  • Текстовое поле / richtextbox с подсветкой синтаксиса?
  • Почему разрешены статические константы?
  • Является ли возrotation ссылкой rvalue более эффективным?
  • Инкрементный анализ JSON в C #
  • Можно ли использовать std :: basic_string в качестве непрерывного буфера при таргетинге на C ++ 03?
  • Как прочитать содержимое файла в строке в C?
  • Добавить параметр в событие Click Button
  • Что более эффективно: вернуть значение против Pass by reference?
  • unsigned int и подписанное сравнение символов
  • Перенаправить console.writeline из приложения Windows в строку
  • Datagridview: Как установить ячейку в режиме редактирования?
  • Давайте будем гением компьютера.