2015-10-21 13 views
8

O ile widzę w standardzie, następujący kod jest prawidłowy. Kompiluje się w MSVC1025.Standardowa niejednoznaczność C++

const struct omg; 
struct omg volatile; 

int main() 
{ 
    return 0; 
} 

Kwalifikatorom const i volatile wydają się bezcelowe w tych deklaracjach. Nie pomagają ani nie szkodzą ani kompilatorowi, ani programistom.

Norma nie wydaje się skłonna do wyeliminowania tych "pustych niejednoznaczności". W przypadku pustej deklaracji ; jest to wyraźnie dozwolone.

Czy istnieją inne przypadki tokenów, które po wstępnym przetworzeniu są nieistotne dla znaczenia wyrażenia?

+1

[ 'register'] (http: // stackoverflow.com/questions/3207018/register-keyword-in-c) –

+8

Nie uznałbym MSVC za wiarygodnego arbitra tego, co standard dopuszcza lub wymaga. I jestem skłonny wątpić, że sytuacja zmieni się przed rokiem 11025 :-) –

+2

kończy się niepowodzeniem na g ++: http://coliru.stacked-crooked.com/a/b486009ecb10f5e7 – NathanOliver

Odpowiedz

4

Zarówno clang jak i gcc odrzucają ten kod za pomocą -pedantic-errors. dzyń zapewnia następujący błąd:

error: 'const' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations] 
const struct omg; 
^ 

error: 'volatile' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations] 

projekt C++ standardowy rozdział 7.1.6.1 CV-kwalifikacyjne [dcl.type.cv] mówi:

[...]If a cv-qualifier appears in a decl-specifier-seq, the init-declarator-list of the declaration shall not be empty.[...]

+0

Przegłosowałem i zaakceptowałem twoją odpowiedź, mimo że nie odpowiedziała ona na moje pytanie w sposób, w jaki została napisana. Szukałem nieistotności takich jak 'if (true);' that nie są ani pełnymi wyrażeniami, ani zależą od innych deklaracji/wyrażeń – Hector

+0

@Hector Całkowicie przegapiłem ten aspekt twojego pytania, czytałem w bardziej wąski sens. Możliwe, że otrzymasz szerszą odpowiedź, która nie byłaby niezwykła. Powinieneś czuć się swobodnie w tym samym czasie, pytania bez akceptacji zwykle mają więcej wyświetleń, a czasem więcej odpowiedzi i będę całkowicie rozumiał. –

+0

@Hector w ogóle standard unika wieloznaczności i czyni takie przypadki źle sformułowanymi lub niezdefiniowanymi zachowaniami. W innych przypadkach standard określi, w jaki sposób należy rozwiązywać niejasności. Ma to sens, ponieważ jednym z celów normy jest usunięcie potencjalnych niejasności i zapewnienie jednolitych wdrożeń. –

Powiązane problemy