,我们可以读到:
在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
和其他...
谢谢!
答案 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;}