2017-04-11 3 views
1

Je suis actuellement entrer dans plus de choses C++ 11 et a sauté environ constexpr. Dans un de mes livres, il est dit que vous devez utiliser pour des constantes comme π par exemple ainsi:en utilisant constexpr double dans les espaces de noms

#include <cmath> 

// (...) 

constexpr double PI = atan(1) * 4; 

Maintenant, je voulais le mettre dans un propre espace de noms, par exemple. MathC:

// config.h 

#include <cmath> 

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

... mais ici dit IntelliSense function call must have a constant value in a constant expression.

Quand je déclare PI la façon suivante, il fonctionne:

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

Quelle est la raison réelle du compilateur ne semble pas aimer constexpr mais static const ici? Est-ce que constexpr ne devrait pas non plus être éligible ici, ou est-ce que c'est tout sur le contexte ici et constexpr ne devrait pas être déclaré en dehors des fonctions?

Merci.

+8

['atan'] (http://fr.cppreference.com/w/cpp/numeric/math/atan) n'est pas' constexpr'. Voir [cette question] (http://stackoverflow.com/questions/17347935/constexpr-math-functions). –

+1

Quel livre utilisez-vous et à quelle page/section correspond ce code? – NathanOliver

+0

Donc, il semble que ce soit une erreur de l'auteur du livre alors. C'est un livre allemand intitulé "C++ - Das umfassende Handbuch" de Jürgen Wolf, publié dans Rheinwerk Computing, 2ème édition en 2014, page 250. Il indique clairement "constexpr double PI_V3 = atan (1) * 4;". – taiBsu

Répondre

2

Quelle est la raison réelle pour laquelle le compilateur ne semble pas aimer constexpr mais static const ici?

A constexpr doit être évaluable au moment de la compilation en static const n'a pas besoin d'être.

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

indique simplement le compilateur que PI ne peut pas être modifié une fois qu'il est initialisé, mais il peut être initialisé au moment de l'exécution.