C ++中的const double表达式

时间:2013-12-03 20:13:57

标签: c++ const constexpr

<{3>}中的

,我们可以读到:

  

在C ++ 11之前,只有当变量声明为const,初始值设定为常量表达式且具有整数或枚举时,才能在常量表达式中使用变量值。类型。   如果使用constexpr关键字定义变量,那么C ++ 11 将删除变量必须为整数或枚举类型的限制:

 constexpr double earth_gravitational_acceleration = 9.8;
 constexpr double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;

这是什么意思?特别是,这是否意味着:

const double earth_gravitational_acceleration = 9.8;
const double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;
在C ++ 11之前,

在C ++中是非法的吗?即使使用-ansi-pedantic和其他...

,g ++也可以

谢谢!

3 个答案:

答案 0 :(得分:5)

你的第二个例子完全不违法。它只是不是编译时常量。这些值可能在运行时计算。

答案 1 :(得分:2)

要查看差异,您需要首先以某种需要常量表达式的方式使用结果,例如定义数组的大小。由于g ++有一个扩展,允许在C ++中使用C99样式的可变长度数组,所以你可能也需要制作那些全局变量。

所以,让我们考虑一些可能性:

double a = 12.34;              // non-const
const double b = a;            // const initialized from non-const. Allowed
const double b_prime = 12.34;  // const initialized from literal.
double constexpr c = 34.56;    // constexpr instead. 

int x[(int)a];                 // fails. `a` is not a constant expression
int y[(int)b];                 // fails. `b` is `const`, but not a constant expression
int y_prime[(int) b_prime];    // works in g++, but shouldn't be allowed.
int z[(int)c];                 // works

请注意,constexpr足够新,以至于某些编译器不支持它(例如,VC ++不支持,至少通过VS 2013中包含的版本)。

答案 2 :(得分:1)

他们在同一页面上提供了一个例子:

int get_five() {return 5;}

int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++03

constexpr int get_five() {return 5;}

int some_value[get_five() + 7]; // Create an array of 12 integers. Legal C++11

因为get_five在编译时保证为5,所以它可以用在常量表达式中。

例如,这会导致错误:

constexpr int get_five() { int a = 5; return a;}