constexpr指针如何存在并且constevel函数在编译时返回指针?

问题描述 投票:0回答:1

我正在浏览 constexpr 和 consteval 的主题,发现了以下内容,

  1. 我们可以拥有 CONSTEXPR 类型的指针
  2. CONSTEVAL 函数可以返回 CONSTEXPR 变量的指针

我的问题是,上面的 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;
  }
c++ pointers constexpr consteval
1个回答
0
投票

上述两个问题是因为,据我所知,所有变量都是在运行时在内存中创建的

是的,但并非所有人都有固定地址。

就标准而言,允许 constexpr 指针指向保留在固定地址的对象。在任何函数(全局对象)之外定义的对象都有一个固定的地址,因此它的地址可以用来初始化 constexpr 指针。

如您的示例中所示,

a
是全局
int
,因此保留在固定地址,因此可以使 constexpr 指针指向它。

实现/编译器可能会象征性地处理此类(constexpr)指针,但这是实现细节。

© www.soinside.com 2019 - 2024. All rights reserved.