У меня возникла проблема с обертыванием вокруг очевидной двусмысленности в спецификации С++ 0x, см. также: http://www.nongnu.org/hcb/
Предположим, что мы имеем код
void foo() {};
Лично я интерпретирую код как function-definition
, за которым следует empty-declaration
. Но, глядя на спецификацию грамматики, я бы сказал, что это можно так же легко интерпретировать как simple-declaration
, которое является частью block-declaration
и, следовательно, раньше упоминается в списке declaration
...
Здесь мое объяснение того, как это можно проанализировать как простое объявление:
void foo() {};"
- > простая декларация
void
- > decl-specifier-seq → decl-specifier → type-specifier → trailing-type- specifier → спецификатор простого типа
foo() {}
- > init declarator-list → init-declarator
foo()
- > declarator → ptr-declarator → noptr-declarator
foo
- > declarator-id → ...
()
- > параметры и квалификаторы
{}
- > initializer → braced-init-list
Таким образом, это должно быть возможно проанализировано как простая декларация.
Мне сказали, что для устранения этого случая необходимо использовать 6.8 спецификации, но я не совсем понимаю, почему. Является simple-declaration
an expression-statement
, так как он заканчивается символом ;
?