为什么C++不允许访问constexpr数组的地址



对于以下代码:

int main()
{
    constexpr char ch[64] = "Hello";
    auto res1 = ch;
    constexpr auto res2 = ch;
}

res1的赋值可以,但res2的赋值无法编译。这意味着我们可以在运行时获得编译时对象的地址,但不能在编译时获得地址。你能告诉我为什么C++阻止了那一行的编译吗?

非常感谢!

标记变量constexpr不会更改其存储持续时间。ch仍然是函数的局部变量,具有自动存储持续时间,并且只存在到函数范围结束。每次调用函数ch都是一个新对象。CCD_ 4不通过CCD_ 5获得静态存储持续时间。

因此,将指向变量的指针作为常量表达式是不合理的。指针的值在每个函数调用中都需要不同,这违反了常量表达式计算为单个编译时常量的假设。

如果您希望变量具有静态存储持续时间,以便在整个程序中只有一个实例,那么除了constexpr之外,还可以添加static。静态存储持续时间对象的地址可以在常量表达式中使用,也可以作为常量表达式的结果使用。变量的不同实例之间的指针值不存在歧义。

最新更新