Да, точка с запятой явно разрешена после определения функции в спецификаторе класса. В результате в настоящее время в черновике 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!
};
Это потому, что он анализируется с помощью объявления-шаблона (которое само по себе будет анализировать оставшийся текст в определение-функции в конце концов), для которого спецификатор класса не имеет дополнительного ;
потом.