2017-08-03 24 views
24

Posiadanie dwóch const dla typu powoduje wyświetlenie ostrzeżenia/błędu. Jeśli jednak typ został zdefiniowany za pomocą typedef, kompilator akceptuje go (zarówno Visual Studio 2013, jak i kompilator C++ w trybie online).Ten sam kwalifikator typu const

#include <iostream> 

typedef const int value_type; 

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

    return 0; 
} 

Czy ktoś ma pomysł, dlaczego? Czy to jest const (const int), który różni się od const const int?

+1

Ten kod jest OK, jakie jest dokładnie twoje pytanie? –

Odpowiedz

30

To wyraźnie dozwolone w przypadku typedef i niedozwolone w deklaracji samego:

[dcl.type/1]

typu, Specyfikatory są:

typu specifier ... cv-kwalifikator
Definiowanie specyfikatora typu: typu specifier

[dcl.spec/1 and 2]

specyfikatorów które mogą być wykorzystane w deklaracji są:

decl-specifier ... definiowania typu -specifier ...

Każdy specyfikator decl powinien pojawić się najwyżej jeden raz w pełnym decl-specifier-seq, z tym że długi może pojawić się dwa razy.

[dcl.type.cv/1]

Istnieją dwa CV-kwalifikacyjne, const i volatile. Każdy cv-kwalifikator pojawi się najwyżej jeden raz w kwalifikatorze cv-seq. Jeśli kwalifikator cv pojawia się w parametrze decl-specifier-seq, lista deklaratorów inicjujących lub lista deklaracji członków deklaracji nie może być pusta. [Uwaga: [basic.type.qualifier] i [dcl.fct] opisują, w jaki sposób cv-qualifiers wpływają na typy obiektów i funkcji . - nota końcowa] Redundantne kwalifikacje cv są ignorowane. [Uwaga: na przykład te mogą być wprowadzone przez typedefs. - nota końcowa]

Oprócz aliasy typów parametr szablonu jest kolejnym przypadkiem, w którym kwalifikator może być zbędny. Uzasadnieniem dla tego jest nie łamanie innych poprawnych deklaracji tylko dlatego, że kwalifikator cv zakradł się do tylnych drzwi.

+2

Jestem pod wrażeniem: zapamiętałeś standard ?! – Bathsheba

+0

@Bathsheba - Tylko indeks :) Cała reszta to bardzo rozmyte wspomnienie. – StoryTeller

+0

Thx, który wydaje się być w tym przypadku.Jednak standard C++ jest naprawdę trudny do odczytania. – gast128

Powiązane problemy