2017-04-11 3 views
1

Ich bin im Moment in mehr C++ 11 Zeug und sprang über constexpr. In einem meiner Bücher ist es, dass Sie es für Konstanten wie π zum Beispiel auf diese Weise verwenden sollten:mit conexpr Doppel in Namespaces

#include <cmath> 

// (...) 

constexpr double PI = atan(1) * 4; 

Nun wollte ich, dass in einem eigenen Namensraum setzen, zum Beispiel. MathC:

// config.h 

#include <cmath> 

namespace MathC { 
    constexpr double PI = atan(1) * 4; 
    // further declarations here 
} 

... aber hier sagt IntelliSense function call must have a constant value in a constant expression.

Wenn ich PI die folgende Art und Weise zu erklären, es funktioniert:

static const double PI = atan(1) * 4; 

Was der eigentliche Grund ist der Compiler scheint nicht constexpr aber static const hier zu mögen? Sollte hier nicht auch constexpr wählbar sein, oder soll es hier nur um den Kontext gehen und constexpr sollte nicht außerhalb von Funktionen deklariert werden?

Vielen Dank.

+8

['atan'] (http://en.cppreference.com/w/cpp/numeric/math/atan) ist nicht" constexpr ". Siehe [diese Frage] (http://stackoverflow.com/questions/17347935/constexpr-math-functions). –

+1

Welches Buch verwenden Sie und welche Seite/Abschnitt ist dieser Code in. – NathanOliver

+0

So scheint es, dass dies ein Fehler des Buchautors dann ist. Es ist ein deutsches Buch mit dem Titel "C++ - Das umfassende Handbuch" von Jürgen Wolf, erschienen in Rheinwerk Computing, 2. Auflage 2014, Seite 250. Es heißt deutlich: consstexpr double PI_V3 = atan (1) * 4; – taiBsu

Antwort

2

Was ist der eigentliche Grund der Compiler scheint nicht constexpr aber static const hier zu mögen?

A constexpr muss bei der Kompilierung auswertbare sein, während static const nicht sein müssen.

static const double PI = atan(1) * 4; 

sagt einfach den Compiler, dass PI nicht geändert werden kann, sobald es initialisiert wird, aber es kann zur Laufzeit initialisiert werden.