2016-06-29 10 views
11

Wenn Sie diesen Code kompilieren (ohne Header)Compile Fehler, wenn ein Mitglied einer benutzerdefinierten wörtlichen mit

template <typename T> 
struct Temperature { 
    T temp; 

    explicit Temperature(T t) 
     : temp(t) 
    {} 
}; 

Temperature<long double> operator "" _f (long double t) 
{ 
    return Temperature<long double>((t - 32)/1.8); 
} 

int main() 
{ 
    auto t = 100.0_f; 
    t.temp; 

    100.0_f.temp; // ERROR AT THIS LINE 
    return 0; 
} 

Die Compiler (beide g ++ 4.8 und Klirren ++ 3.4 auf Ubuntu 14.04) wird sich beschweren, dass

error: unable to find numeric literal operator ‘operator"" _f.temp’ 
    100.0_f.temp; 
    ^

Es scheint, dass die _f.temp als Suffix dort gilt. Warum parsen die Compiler es so, anstatt am Punkt anzuhalten?

+2

Maximale Munch. '100.0_f.temp' ist ein gültiges * pp-Nummer * -Token. –

+1

Wechsel zu '(100.0_f) .temp' – Mine

+0

@ T.C. Habe keine Ahnung, dass ein pp-Nummern-Token mehr als einen Punkt enthalten könnte. Können Sie mir ein Beispiel in einer solchen Form zeigen? – neuront

Antwort

14

Preprocessing numbers sind ungerade Biester, die hauptsächlich dazu dienen, den Präprozessor einfacher zu schreiben.

pp-number: 
    digit 
    . digit 
    pp-number digit 
    pp-number identifier-nondigit 
    pp-number ' digit 
    pp-number ' nondigit 
    pp-number e sign 
    pp-number E sign 
    pp-number p sign 
    pp-number P sign 
    pp-number . 

12 ist eine gültige pp-Nummer Token, so ist 0xe+foo (siehe das Beispiel in [lex.pptoken]/4), und so ist .12.CA'TS_RULE..56.me+owp-urr. Wenn die letzten beiden die Übersetzungsphase 6 überholen, dann ist das Programm schlecht ausgebildet, da es in Phase 7 nicht in ein gültiges Token umgewandelt werden kann. Bis dahin ist es jedoch gültig, also sagt munch maximal 0xe+foo oder 100.0_f.temp als ein einzelnes Vorverarbeitungstoken.

+0

Wirklich Bestien. Hoffe, der Standard gibt ein Update, um Codes einfacher zu schreiben. – neuront

+2

Ich hätte nie gedacht, '0xe + foo' könnte ungültig sein C++, das scheint so falsch ... – Holt