In C++ 11 quando viene rilevato un direttiva al preprocessore della forma ...Inclusione condizionale in C++ 11 con valori letterali definiti dall'utente?
#if expr
..., expr
è valutato come un constant-expression
come descritto in 16.1 [cpp.cond]
.
Ciò avviene dopo macro sostituzione su expr
, relativi identificatori (e le chiavi) sono sostituiti da 0, il suo preprocessing-tokens
sono convertiti tokens
, defined
operatore viene valutata, e così via.
La mia domanda è cosa succede quando uno dei token in expr
è un user-defined-literal
?
I valori letterali definiti dall'utente sono come le chiamate di funzione, ma le chiamate di funzione non possono verificarsi in expr
(credo), come effetto collaterale della sostituzione dell'identificatore. Tuttavia, tecnicamente user-defined-literals
potrebbe sopravvivere.
Ho il sospetto che sia un errore, ma non riesco a capire come concludere quello standard?
Forse l'impatto (pedante) dell'aggiunta di valori letterali definiti dall'utente alla clausola 16 [cpp]
è stato semplicemente ignorato?
O mi manca qualcosa?
Aggiornamento:
Per chiarire con un esempio:
Che cosa significa questo pre-elaborazione a:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
bar o baz o è un errore?
GCC 4.7 rapporti:
test.cpp:1:5: error: user-defined literal in preprocessor expression
quindi pensa è un errore. Questo può essere giustificato con riferimento allo standard? O è solo "implicito"?
La nozione di "espressione costante" del preprocessore è molto diversa da quella del C++, credo. Puoi davvero usare solo letterali e macro che alla fine si espandono in letterali ... almeno è così che ho sempre capito. –
Sembra che la tua versione di g ++ manchi qualcosa, non tu. –
Dubito che sia stato l'intento del comitato di consentire questo genere di cose, dal momento che la logica della preelaborazione e della semantica del linguaggio sono sempre state così separate. Ma sì, lo standard sembra implicare che dovrebbe essere gestito. – aschepler