Является синтаксической ошибкой в ​​С++ для завершения функции внутри определения класса с помощью;};

Этот код был предоставлен мне моим учителем в качестве примера функций в классе С++. Мне это кажется странным. Я всегда использовал для завершения функции с }. Я думаю, что только определение класса заканчивается на };. Здесь определения функций заканчиваются на };. Как функция в классе, помимо публичного или частного, отличается от автономной функции? Это просто причуда или особенность С++?

class GenericItem {
public:
   void SetName(string newName) {
      itemName = newName;
   };

   void SetQuantity(int newQty) {
      itemQuantity = newQty;
   };

   void PrintItem() {
      cout << itemName << " " << itemQuantity << endl;
   };

private:
   string itemName;
   int itemQuantity;
};

Ответы

Ответ 1

Это законно и всегда было законным (начиная с С++ 98), но синтаксический смысл этого ; изменился с С++ 11 на С++ 14.

В С++ 11 (и раньше) допускается ;, и это необязательная часть определения функции-члена.

член-декларация:
    decl-specifier-seq opt member-declarator-list opt;
    определение функции; opt
   :: opt шаблон вложенного имени-спецификатора opt unqualified-id;
    используя декларирование
    шаблон декларация

Это не пустое объявление. (С++ 11 не поддерживает пустые объявления в области класса. Пустые объявления разрешены только в области пространства имен.) Таким образом, в случае С++ 11 (и до), что дополнительный ; - это просто причуда грамматики языка, Почему это всегда было разрешено, мне не совсем понятно.

В С++ 14 (за n4296) этот ; больше не является частью определения функции-члена. Это автономное пустое объявление, которое является законным в области класса с С++ 14.

член-декларация:
    атрибут-specifier-seq opt decl-specifier-seq opt member-declarator-list opt;
    функция четкости
    используя декларирование
    static_assert декларация
    шаблон декларирование
    псевдоним декларации
    пустая декларация

В основном это означает, что следующее определение недопустимо в С++ 11 (и раньше), но оно действительно в С++ 14

class C
{
  void foo() {};;
};

(Любопытно, что GCC отвергает его в режиме С++ 14.)

Ответ 2

Это полностью действует. Дополнительная точка с запятой ограничивает "пустое" объявление.

Это не "quirk", так как он действителен после функций, не являющихся членами.

Странно использовать ;, когда вам этого не нужно, поэтому я не знаю, почему ваш учитель показал это вам таким образом. Это зависит от вас, но я бы вообще не рекомендовал использовать дополнительный ; (и ваш компилятор, как видно из предупреждений, которые он испускает для вышеуказанного кода, согласен со мной).

Конечно, вы просто попробовали бы его выяснить.

Ответ 3

';' можно рассматривать как пустое предложение, которое ничего не делает. Чтобы сделать код чистым, это не очень хороший способ с таким количеством пустых предложений, которые ничего не делают в классе.