Gleichwertiger ternärer Operator für constexpr if?

9

Vielleicht habe ich etwas verpasst, aber ich kann keine Hinweise finden: Gibt es in C ++ einen consExprternären Operator, der conexpr-if entspricht?

%Vor%     
wimalopaan 07.12.2016, 07:44
quelle

2 Antworten

5

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.

    
Nicol Bolas 24.02.2017 00:06
quelle
3

Nein, es gibt keinen bedingten Operator constexepr . Aber Sie könnten das Ganze in ein Lambda einpacken und es sofort auswerten (ein IIFE ):

%Vor%

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 .

    
Barry 23.02.2017 23:54
quelle

Tags und Links