Этот конечный ;
в пространстве имен составляет пустой декларации. Что у вас есть в приведенном выше коде, рассматривается компилятором как
CircBuffer::CircBuffer()
{
...
} // <- the `CircBuffer::CircBuffer` definition ends here
; // <- an empty declaration that declares nothing
I.e. определение метода на самом деле не заканчивается };
с точки зрения компилятора. Он заканчивается }
, и ;
обрабатывается полностью отдельно и независимо.
Пустая декларация была незаконной в исходной версии C++ и на C++ 03, но она была легализована на C++ 11. Таким образом, приведенный выше код недействителен в C++ 98 и C++ 03, но является законным в C++ 11. Однако даже компиляторы C++ 98 часто поддерживали пустые объявления как нестандартное расширение.
Обратите внимание, что вышеизложенное относится только к определениям вне класса (как в вашем примере). С определениями функций члена в своем классе задний ;
всегда был законным (и необязательно)
class C
{
C()
{
...
}; // <- ';' not required, but legal even in C++98
};
(В этом случае дополнительный ;
на самом деле является частью определения члена, а это означает, что определение действительно заканчивается в };
и не вводит пустую декларацию.)
Когда вы видите что-то подобное в фактическом коде, это, вероятно, просто плохая привычка, возможно, основанная на путанице между контекстами определения в классе и вне класса.
Это пустое заявление. только определения типа требуют точки с запятой: 'class A {...};' function do not – BeyelerStudios
Пустой оператор it.it похож на высказывание «не выполнять какой-либо оператор в этой строке» – DesirePRG
Скорее всего, опечатка – Martin