Допускается повторение квалификатора const в C, но не в C ++? - PullRequest
21 голосов
/ 25 апреля 2011

Пример кода

const const const int x = 10;   
int main()
{}

компилируется в C, но не в C ++.Почему он компилируется в C?Я думал, что это не удастся и в Си.Не берите в голову.

Какая часть стандарта C ++ запрещает использование дубликата const, а какая часть стандарта C позволяет это?

Ответы [ 4 ]

23 голосов
/ 25 апреля 2011

C99 §6.7.3 / 4:

Если один и тот же классификатор появляется более одного раза в одном и том же спецификаторе-списке-спецификаторах , либо напрямую, либо через один или несколько typedef s, поведение такое же, как если бы появился только один раз.

Да, это действительно C99, и ваше открытие верно.

16 голосов
/ 25 апреля 2011

Из последнего черновика C ++ 0x, [dcl.type]:

Как правило, не более одного спецификатора типа допускается в полном decl-specier-seq объявления или в type-specier-seq или trailing-type-specier-seq. Единственными исключениями из этого правила являются следующие:

- const можно комбинировать с любым спецификатором типа, кроме самого себя.

- volatile можно комбинировать с любым спецификатором типа, кроме самого себя.

- со знаком или без знака можно сочетать символы char, long, short или int.

- короткий или длинный может сочетаться с int.

- длинные можно комбинировать с двойными.

- long можно комбинировать с long.

4 голосов
/ 25 апреля 2011

C ++ 2003 запрещает это в 7.1.5 / 1 «... избыточные cv-квалификаторы запрещены, за исключением случаев, когда они вводятся с использованием typedefs или аргументов типа шаблона ...».

4 голосов
/ 25 апреля 2011

По-видимому, грамматика C ++ 0x позволяет:

CV-спецификатор-сл

  • cv-qualifier cv-qualifier-seq opt

CV-отборочные

  const

  volatile

Кроме того, [decl.type.cv], по-видимому, позволяет:

Существует два cv-квалификатора , const и volatile. Если cv-qualifier появляется в decl-specier-seq , init-Declarator-list объявления не должен быть пустым. [Примечание: 3.9.3 и 8.3.5 описывают, как cv-квалификаторы влияют на типы объектов и функций. - примечание конца] Избыточные cv-квалификации игнорируются. [Примечание: например, эти может быть введен typedefs. - конец примечания]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...