Точки с запятой в определении класса - PullRequest
8 голосов
/ 20 марта 2011

Я читал это получилось , и вот пример кода оттуда:

struct X {
  static bool f( int* p )
  {
    return p && 0[p] and not p[1:>>p[2];
  };
};

Вопрос заключался в следующем: сколько ошибок должен выдать совместимый компилятор:

Я ответил один, потому что этот код эквивалентен

struct X {
  static bool f( int* p )
  {
    return p && p[0] && ! p[1] > p[2];
  };
};

И я думал, что точка с запятой после определения статической функции будет ошибкой. Но мистер Саттер говорит 0 и объясняет (помимо того, что я понимаю), что

Допустимая точка с запятой допускается при конец объявления функции.

Мой вопрос:

  • Какой текст в стандарте позволяет это?
  • Относится ли это только к функциям-членам?
  • Может ли точка с запятой появляться между двумя членами или в любом другом месте в определении класса, как в

     struct X
     {
       int a;;;;int b; //Legal?
     };
    

Ответы [ 2 ]

14 голосов
/ 20 марта 2011

Да, точка с запятой явно разрешена после определения функции в спецификаторе класса. В результате в настоящее время в черновике C ++ 0x также допустимо следующее: первая точка с запятой принадлежит определению функции, а вторая - спецификатору класса, делегирующему нетерминалу определения функции.

struct A {
  void f() = delete;;
};

Но три точки с запятой были бы незаконными. Как и две точки с запятой после определения функции, имеющей тело. Соответствующий текст в спецификации - это грамматика 9.2[class.mem].

Точки с запятой после определений функций были разрешены уже в C ++ 03, но они не были разрешены в области имен после определений функций. C ++ 0x исправляет это, вводя пустые объявления. Но они появляются только тогда, когда у вас есть точка с запятой после определения функции вне тела класса.

Саттер говорит о «лишних» точках с запятой в конце функции объявлений , что не совсем правильно. Потому что следующий неверный синтаксис

struct A {
  void f();; // invalid!
};

Дополнительная точка с запятой в спецификаторе класса действительна только после определения функции . Кроме того, как показывает проверка на 9.2, она недопустима, когда определение функции является шаблоном

struct A {
  template<typename T> void f() { }; // invalid!
};

Это потому, что он анализируется с помощью объявления-шаблона (которое само по себе будет анализировать оставшийся текст в определение-функции в конце концов), для которого спецификатор класса не имеет дополнительного ; потом.

1 голос
/ 20 марта 2011

; - пустое утверждение.Вы можете иметь столько пустых утверждений, сколько захотите.Это абсолютно правильно.

int foobar(int arg)
{
    return 0;
};

- это то же самое, что и

int foobar(int arg)
{
    return 0;
}
/*DO NOTHING*/;

Подобный вопрос: Почему пустые выражения допустимы в C / C ++?

Редактировать:

Объявление члена также является заявлением.Таким образом, пустой оператор внутри класса является чем-то вроде << пустого> оператора объявления внутри класса:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...