提问者:小点点

带有“constexpr”的基本示例无法编译


我正在学习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的值应该在编译时就知道,所以应该不会有任何问题。

我不知道我在哪里犯错了。 (请宽容我的第一语言是法语)


共2个答案

匿名用户

您对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。