如何正确声明常量表达式
How to declare a constant expression correctly?
我正在阅读《c++编程语言》,并试图理解Constants
。书上说这是有效的:
const int dmv = 17; // dmv is a named constant
constexpr double max1 = 1.4∗square(dmv); // OK if square(17) is a constant expression
但是当我这样做的时候:
constexpr double square(double x)
{
return x * x;
}
int main()
{
const double x = 40.0;
constexpr double result = 1.2 + square(x);
}
有两个错误:
- 表达式必须具有恒定值(在
x
中,如果我将其替换为12.4
(如square(12.4)
)的值,则错误消失) - 函数调用必须在常量表达式中有一个常量值(在square方法调用中)
这些错误的原因是什么?我错过了什么?
在c++ 11之前,constexpr
不存在,编译时算术只能用于整数类型(或多或少)。
在该语言中,使const int
"变量"在任何可能的情况下都是真正的常量是有意义的,而对于const double
则不是这样。
c++ 11引入了constexpr
,因此不再需要const T
变量的特殊规则,但是删除该规则将不必要地破坏现有代码。c++ 11还引入了编译时浮点运算,但由于const double
变量以前从未被视为常量表达式,现在更改它也没有什么好处,因此需要显式地说constexpr
。
constexpr double square(double x)
{
return x * x;
}
int main()
{
constexpr double x = 40.0;
constexpr double result = 1.2 + square(x);
}
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 如何在常量计算表达式中获取编译时错误?
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组