das folgende Code-Snippet vor:Undefiniertes Verhalten, wenn constexpr-negative Bitverschiebung auswertet?
int main(){
constexpr int x = -1;
if(x >= 0){
constexpr int y = 1<<x;
}
}
GCC 7 (und wahrscheinlich auch andere Versionen von GCC) weigert sich, dies zu kompilieren und sagt:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
Ich kann wo denke, das herkommen kann: Die constexpr
Deklaration auf y
macht GCC y
zur Kompilierzeit auswerten, wo es negativ sein könnte. Durch das Entfernen der constexpr
wird der Fehler behoben.
Ist dieses undefinierte Verhalten jedoch vom Standard? Die Bedingung ist immer falsch, daher wird der Wert y
niemals verwendet.
In meinem tatsächlichen Code ist x
ein Vorlagenparameter, der negativ sein kann oder nicht.
Können Sie 'if conexpr' verwenden? – MikeMB
@MikeMB - Theoretisch könnte das funktionieren. [Aber GCC gibt immer noch den gleichen Fehler aus] (http://coliru.stacked-crooked.com/a/5302256c8fb5ccda). Wahrscheinlich ein Compiler Bug. – StoryTeller
Negative Linksverschiebung ist undefiniertes Verhalten.Während der Laufzeit wäre dies kein Problem, da die Bedingung dies verhindert. Aber genau wie Sie gesagt haben, muss der Compiler den Ausdruck während der Kompilierzeit auswerten und muss einen Fehler für jede Instanz von UB generieren. – MikeMB