In C++ 11 es legal ist zum Beispiel zu schreiben,:Gibt es eine Möglichkeit, eine static_assert in einen Ausdruck in ISO C++ 11 zu gleiten?
int b = (some_function_returning_void(), 1020);
Und Sie werden wieder 1020. bekommen, aber es wird nicht zulassen, schreiben:
int b = (static_assert(2 > 1, "all is lost"), 304);
Die documentation erklärt die Stellen, an denen Recht static_assert (a keyword, scheinbar) können auftreten: bei Block Umfang
eine statische assert Deklaration (als Block Anmeldung) und innerhalb einer Klasse Körper auftreten kann (wie Mitglied Erklärung)
nur für das Heck von ihm habe ich versucht, ein paar Dinge, bis das funktionierte:
int b = ({static_assert(2 > 1, "all is lost"); 304;});
Aber mit -Wpedantic
ich "warning: ISO C++ forbids braced-groups within expressions"
bekommen. Interessanterweise werden diese als "Anweisungsausdrücke" und used in the Linux kernel bezeichnet.
Aber lassen Sie uns vorstellen, ich möchte -Wpedantic
bleiben. Gibt es saubere Workarounds?
Kontext: Ich versuche, ein Makro zu schreiben, das in ANSI C89 funktioniert, fügt jedoch eine zusätzliche Überprüfung hinzu, wenn es als ISO C++ 11 erstellt wird. Ja ich bin komisch, danke für die Nachfrage. Oh, das war keine Frage? Kommentar, wenn Sie dies in 9999999999999999999 lesen .... – HostileFork
Sie könnten das statische Assert in einen Lambda-Ausdruck setzen. '[] {Static_assert (..); }(), 1020' – dyp
@dyp Interessante Idee ... obwohl in meinem unten stehenden Hinweis frage ich, was die Auswirkungen davon für ein Makro sein könnte, viele, viele Male aufgerufen ... – HostileFork