22
votes

Sample code snippet

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

gets compiled in C but not in C++. Why does it get compiled in C? I thought this would fail in C as well. Never mind.

Which part of the C++ Standard forbids the use of duplicate const and which part of the C standard allows this?

4
Is that duplicate? or repeated? :P - Nawaz
x is const and I really mean it this time!! - John
C allows it and C++ does not because it is a matter of program safety. If you repeat const three times, you will summon the ghost of Dykstra to inspect your code and punish you if it doesn't meet his standards. No coder has ever survived the experience. - T.E.D.
@T.E.D. You misspelled Dijkstra's name, he's going to be rolling in his grave ;) - fredoverflow
@FredOverflow - Nah, I understand he's very easygoiAIEEEEEE!!! - T.E.D.

4 Answers

23
votes

C99 §6.7.3/4:

If the same qualifier appears more than once in the same specifier-qualifier-list, either directly or via one or more typedef s, the behavior is the same as if it appeared only once.

Yes, that is valid C99, and your discovery is correct.

17
votes

From the last C++0x draft, [dcl.type]:

As a general rule, at most one type-specifier is allowed in the complete decl-specifier-seq of a declaration or in a type-specifier-seq or trailing-type-specifier-seq. The only exceptions to this rule are the following:

— const can be combined with any type specifier except itself.

— volatile can be combined with any type specifier except itself.

— signed or unsigned can be combined with char, long, short, or int.

— short or long can be combined with int.

— long can be combined with double.

— long can be combined with long.

5
votes

C++ 2003 prohibits it in 7.1.5/1 "... redundant cv-qualifiers are prohibited except when introduced through the use of typedefs or template type arguments ...".

4
votes

The C++0x grammar appears to allow it:

cv-qualifier-seq:

  • cv-qualifier cv-qualifier-seq opt

cv-qualifier:

  const

  volatile

Also, [decl.type.cv] appears to allow it:

There are two cv-qualifiers, const and volatile. If a cv-qualifier appears in a decl-specifier-seq, the init-declarator-list of the declaration shall not be empty. [ Note: 3.9.3 and 8.3.5 describe how cv-qualifiers affect object and function types. — end note ] Redundant cv-qualifications are ignored. [ Note: For example, these could be introduced by typedefs. — end note ]