对于以下代码:
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
。静态存储持续时间对象的地址可以在常量表达式中使用,也可以作为常量表达式的结果使用。变量的不同实例之间的指针值不存在歧义。