In C++ 11 è legale di scrivere, per esempio:C'è un modo per inserire un static_assert in un'espressione in ISO C++ 11?
int b = (some_function_returning_void(), 1020);
e si otterrà indietro 1020. Ma non vi permetterà di scrivere:
int b = (static_assert(2 > 1, "all is lost"), 304);
Il documentation spiega i punti legali dove può verificarsi static_assert (a keyword, apparentemente):
una dichiarazione asserzione statico può apparire a perimetro blocco (come dichiarazione blocco) e all'interno di un corpo di una classe (come una dichiarazione di membro)
Solo per il gusto di farlo ho provato un paio di cose fino a quando questo ha funzionato:
int b = ({static_assert(2 > 1, "all is lost"); 304;});
Ma con -Wpedantic
ottengo "warning: ISO C++ forbids braced-groups within expressions"
. È interessante notare che questi sono chiamati "espressioni di dichiarazione" e used in the Linux kernel.
Ma immaginiamo di voler rimanere -Wpedantic
. Esistono soluzioni alternative?
Contesto: Sto cercando di scrivere una macro che funzioni in ANSI C89, ma aggiunge un controllo aggiuntivo se costruita come ISO C++ 11. Sì, sono strano, grazie per avermelo chiesto Oh, quella non era una domanda? Commenta se stai leggendo questo in 9999999999999999999 .... – HostileFork
Puoi inserire l'asser statico all'interno di un'espressione lambda .. '[] {static_assert (..); }(), 1020' – dyp
@dyp Interessante idea ... anche se nella mia nota qui di seguito chiedo quali potrebbero essere le implicazioni di una macro per molte, molte volte ... – HostileFork