2017-07-28 2 views
0

Ich lese Bjarne Stroustrup's Buch, "Die C++ Programmiersprache" und ich fand ein Beispiel, das static_assert erklärt. Was ich verstanden habe ist, dass static_assert nur mit Dingen funktioniert, die durch konstante Ausdrücke ausgedrückt werden können. Mit anderen Worten, es darf keinen Ausdruck enthalten, der zur Laufzeit ausgewertet werden soll.static_assert schlägt fehl, wenn die Testbedingung Konstanten enthält, die mit const definiert sind?

Das folgende Beispiel wurde in dem Buch (ich habe einige Änderungen im Code. Aber ich glaube nicht, dass irgendetwas in dem Buch. Gegeben durch den ursprünglichen Beispielcode erzeugt werden würde ändern, sollte die)

verwendet
#include <iostream> 

using namespace std; 

void f (double speed) 
{ 
    constexpr double C = 299792.468; 
    const double local_max = 160.0/(60*60); 
    static_assert(local_max<C,"can't go that fast"); 
} 

int main() 
{ 
     f(3.25); 
    cout << "Reached here!"; 
    return 0; 
} 

Das oben genannte gibt einen Kompilierungsfehler. Hier ist es mit ideone zusammengestellt: http://ideone.com/C97oF5

den genauen Code aus dem Buch Beispiel:

constexpr double C = 299792.458; 
void f(double speed) 
{ 
    const double local_max = 160.0/(60∗60); 
    static_assert(speed<C,"can't go that fast"); // yes this is error 
    static_assert(local_max<C,"can't go that fast"); 
} 
+0

Ich kann mich nicht daran erinnern, irgendeine Zeile in den obigen zwei Codefragmenten entfernt oder hinzugefügt zu haben. Sie können den Bearbeitungsverlauf überprüfen (wenn das möglich ist). –

+0

Ich entschuldige mich. Ich sehe diese Codezeile immer noch in Ihrem Post. –

+0

Die Zeile existiert noch und kommentiert mit // Ja, das ist ein Fehler. Bitte beachten Sie, dass in der Frage zwei verschiedene Code-Snippets enthalten sind. Lesen Sie die Frage sorgfältig und Sie werden es verstehen. –

Antwort

0

Der Compiler weiß nicht, den Wert von speed bei der Kompilierung. Es macht Sinn, dass es speed < C zur Kompilierzeit nicht auswerten kann. Somit wird eine Kompilierung Fehler zu erwarten, wenn die Linie der Verarbeitung

static_assert(speed<C,"can't go that fast"); 

Die Sprache garantiert nicht, dass Floating-Point-Ausdrücke bei der Kompilierung ausgewertet werden. Einige Compiler unterstützen es möglicherweise, aber das ist nicht verlässlich.

Obwohl die Werte der Fließkommavariablen für einen menschlichen Leser "Konstanten" sind, werden sie nicht unbedingt zur Kompilierzeit ausgewertet. Die Fehlermeldung des Compilers von dem von Ihnen angegebenen Link macht es deutlich.

static_assert expression is not an integral constant expression 

Sie werden einen Weg finden müssen, um den Vergleich mit Integralausdrücke zu tun. Dies scheint jedoch ein strittiger Punkt zu sein. Ich vermute, was Sie wirklich tun möchten, ist sicherzustellen, dass speed innerhalb einer bestimmten Grenze ist. Das macht nur als Laufzeitüberprüfung Sinn.

+0

Sehen Sie sich den Code an, der in ideone.com kompiliert wurde. Es enthält nicht die Zeile, über die Sie sprechen, gibt aber trotzdem einen Fehler. –

+0

Danke. Mit Ihrer aktualisierten Antwort wäre es in Ordnung zu argumentieren, dass das Buch selbst Vergleiche mit "doppelten" Werten macht und kommentierte, dass es in Ordnung sein sollte. –

Verwandte Themen