Подтвердить что ты не робот

Тот же тип классификатора типа

Наличие двух const для типа вызывает предупреждение/ошибку. Однако, если тип был определен с помощью typedef, компилятор принимает его (как Visual Studio 2013, так и онлайн-компилятор С++).

#include <iostream>

typedef const int value_type;

int main()
{
    const value_type  n = 0;   //ok 
    const const int   n2 = 0;  //error C4114

    return 0;
}

Есть ли у кого-нибудь идея, почему? Разве что он const (const int), который отличается от const const int?

4b9b3361

Ответ 1

Он явно разрешен в случае typedef и не разрешен в самом объявлении:

[dcl.type/1]

Спецификаторы типов:

тип-спецификатор:... cv-qualifier
define-type-specifier: тип-спецификатор

[dcl.spec/1 и 2]

Спецификаторами, которые могут использоваться в объявлении, являются:

decl-specifier:... define-type-specifier...

Каждый спецификатор decl должен появляться не более одного раза в полном decl-specifier-seq, за исключением того, что long может появляться дважды.

[dcl.type.cv/1]

Существует два cv-квалификатора, const и volatile. Каждый cv-определитель должны появляться не более одного раза в cv-qualifier-seq. Если cv-определитель появляется в объявлении-спецификаторе-seq, списке init-declarator-list или Объявление-декларация участника-декларатора не должно быть пустым. [ Заметка: [basic.type.qualifier] и [dcl.fct] описывают, как влияют cv-квалификаторы объектов и типов функций. - конечная нота] Резервные cv-квалификации игнорируются. [Примечание: например, они могут быть введены Определения типов. - end note]

Помимо псевдонимов типов, параметр шаблона - это еще один случай, когда квалификатор может быть избыточным. Обоснование того, чтобы разрешить это, заключается в том, чтобы не нарушать иначе правильные объявления только потому, что cv-квалификатор пробирался в заднюю дверь.