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