c ++ 0x: устранение двусмысленности между определением функции, за которым следует пустое объявление и простое объявление

У меня возникла проблема с осознанием очевидной двусмысленности в спецификации c ++ 0x, см. Также: http://www.nongnu.org/hcb/

​​Предположим, у нас есть код

void foo() {};

Лично я интерпретирую код как определение функции , за которым следует пустое объявление . Но, глядя на спецификацию грамматики, я бы сказал, что это можно так же легко интерпретировать как простое объявление , которое является частью объявления блока и, следовательно, упоминается ранее в список объявлений ...

Вот мое объяснение того, как это может быть проанализировано как простое объявление:

void foo() {};"

-> простое объявление

void

-> decl-спецификатор-seq - > спецификатор объявления -> спецификатор типа -> завершающий тип- спецификатор -> спецификатор простого типа

foo() {}

-> инициализирующий список-деклараторов -> инициализирующий-декларатор

foo()

-> декларатор-декларатор -> птр-декларатор -> noptr-декларатор

foo

-> декларатор-идентификатор -> .. .

()

-> параметры и квалификаторы

{} 

-> инициализатор -> список инициализации в скобках

Таким образом, это должно быть возможно проанализировать как простое объявление.

Мне сказали, что 6,8 из спецификацию следует использовать для устранения неоднозначности в этом случае, но я не совсем понимаю, почему. Является ли простое объявление выражением-оператором , поскольку оно заканчивается ; ?

15
задан Johannes Schaub - litb 1 October 2011 в 14:56
поделиться