У меня есть простой кусок кода:
const const int a = 10;
Не удается скомпилировать с gcc :
error: duplicate 'const'
Однако clang компилирует его с предупреждением:
warning: duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]
Компилятор Microsoft также генерирует предупреждение.
Также ситуация с квалификатором volatile
такая же.
Из [dcl.type] (http://www.open -std.org / jtc1 / sc22 / wg21 / docs / documents / 2017 / n4713.pdf ):
Как правило, самое большееодин определяющий тип-спецификатор разрешен в полном decl-specier-seq объявления или в определяющем типе-спецификаторе-seq, и не более одного спецификатора типа допускается в type-specier-seq.Единственными исключениями из этого правила являются следующие:
(2.1) const можно комбинировать с любым спецификатором типа, кроме самого себя.
(2.2) volatile можно комбинировать с любым спецификатором типа, кроме самого себя.
(2.3) со знаком или без знака можно комбинировать с типом char, long, short или int.
(2.4) можно комбинировать как short или long с int.
(2.5) long можно комбинировать с double.
(2.6) long можно комбинировать с long.
Так что я не совсем понимаю, что означает «как правило»,Является ли это формально действительным или нет?
Также я обнаружил связанную проблему Допустимый повторяющийся квалификатор const разрешен в C, но не в C ++? , но в основном обсуждаются различия между c и c ++.