我正在浏览 constexpr 和 consteval 的主题,发现了以下内容,
我的问题是,上面的 2 个怎么可能?
以上两个问题是因为,据我所知,所有变量都是在运行时在内存中创建的,而指针是该内存的地址。
那么,CONSTEXPR 类型的指针如何存在(因为 CONSTEXPR 变量必须在编译时初始化)? CONSTEVAL 函数如何在编译期间返回 CONSTEXPR 变量的指针?
constexpr int a{1};
consteval const int* aptrfunc() //How can this function return a pointer at compile time
{
return &a;
}
int main()
{
constexpr const int* aptr{&a}; //How can this exist at compiletime?
std::cout<<aptr<<'\n'; //Prints address of a
std::cout<<aptrfunc()<<'\n'; //Prints address of a
return 0;
}
上述两个问题是因为,据我所知,所有变量都是在运行时在内存中创建的
是的,但并非所有人都有固定地址。
就标准而言,允许 constexpr 指针指向保留在固定地址的对象。在任何函数(全局对象)之外定义的对象都有一个固定的地址,因此它的地址可以用来初始化 constexpr 指针。
如您的示例中所示,
a
是全局int
,因此保留在固定地址,因此可以使 constexpr 指针指向它。
实现/编译器可能会象征性地处理此类(constexpr)指针,但这是实现细节。