Vielleicht habe ich etwas verpasst, aber ich kann keine Hinweise finden: Gibt es in C ++ einen consExprternären Operator, der conexpr-if entspricht?
%Vor% Sie scheinen unter der Annahme zu handeln, dass if constexpr
eine Leistungsoptimierung ist. Es ist nicht . Wenn Sie einen konstanten Ausdruck in eine ?:
-Klausel setzen, wird jeder verwendungswürdige Compiler herausfinden, woran er sich befindet, und die Bedingung entfernen. Also wird der Code, wie du ihn geschrieben hast, fast sicher auf eine einzige Option für eine bestimmte Mode
kompilieren.
Der Hauptzweck von if constexpr
besteht darin, den anderen Zweig vollständig zu eliminieren. Das heißt, der Compiler überprüft nicht einmal, ob er syntaktisch gültig ist. Dies wäre für etwas, wo Sie if constexpr(is_default_constructible_v<T>)
, und wenn es wahr ist, tun Sie T()
. Bei einer normalen if
-Anweisung, wenn T
nicht standardmäßig konstruierbar ist, muss T()
immer noch syntaktisch gültiger Code sein, selbst wenn die umgebende if
-Klausel ein konstanter Ausdruck ist. if constexpr
entfernt diese Anforderung; Der Compiler verwirft Anweisungen, die sich nicht in der anderen Bedingung befinden.
Dies wird für ?:
noch komplizierter, weil der Typ des Ausdrucks auf den Typen der beiden Werte basiert. Als solche müssen beide Ausdrücke legale Ausdrücke sein, selbst wenn einer von ihnen nie ausgewertet wird. Eine constexpr
Form von ?:
würde vermutlich die Alternative verwerfen, die nicht zur Kompilierzeit genommen wurde. Und deshalb sollte der Ausdruckstyp nur auf einem von ihnen basieren.
Das ist eine ganz andere Sache.
Nein, es gibt keinen bedingten Operator constexepr
. Aber Sie könnten das Ganze in ein Lambda einpacken und es sofort auswerten (ein IIFE ):
Es ist vielleicht nicht der sexieste Code aller Zeiten, aber es macht den Job erledigt. Beachten Sie, dass lambdas standardmäßig constexpr
sind, wenn möglich ab N4487 und P0170 .
Tags und Links c++ constexpr c++17 if-constexpr