我正在学习C++,所以我现在正在读“C++入门”这本书。
我读了一些关于“ConstExpr变量”的例子,我只是想尝试一下我刚写的一个基本代码,但是它不能编译,我不知道为什么。
这是代码:
#include <iostream>
using namespace std;
int j = 8;
const int *p = &j;
int main()
{
constexpr int i = *p; // *p should be 8.
return 0;
}
编译器说:“p的值在常量表达式中不可用”
如果我将“constexpr”替换为“const”,完全没有问题,但是我认为,因为*p的值应该在编译时就知道,所以应该不会有任何问题。
我不知道我在哪里犯错了。 (请宽容我的第一语言是法语)
您对const
对象与constexpr
对象之间的区别似乎存在着根本的误解。 变量为const
意味着它在逻辑上是const
,也就是说,一旦它被初始化,就不能更改它的值。 这并不意味着该值在编译时是已知的,而这正是constexpr
所表示的。
对于某些类型T
T t = {}; // not const, not constexpr
const T t = {}; // const, but not constexpr
constexpr T t = {}; // constexpr, also implies const
到目前为止,一切都很好,但还有一个额外的问题:整数或枚举类型的变量是const
,并且被分配了一个常量表达式,也是constexpr
。 这种差异有很好的理由,但这意味着:
const int i = 42; // i is int, and const, so it's also constexpr !!
当然,如果要将表达式用作常量表达式,则必须将其声明为constexpr
变量或函数。
不编译的原因是J不是const或constexpr。 注P是常量指针。 这意味着P也可以改变,因此您也需要constexpr。