无法使用 constexpr int 变量定义 constexpr 指针

Tha*_*yen 1 c++ pointers constexpr

int main() {\n  constexpr int i = 5;\n  constexpr const int *p = &i;\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

编译上面的代码后:

\n
g++ main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

这是错误:

\n
\n

main.cpp: 在函数 \xe2\x80\x98int main()\xe2\x80\x99: \xe2\x95\x91
\n~ \xe2\x95\x91main.cpp:3:28: 错误: \xe2\x80 \x98& i\xe2\x80\x99 不是常量表达式 \xe2\x95\x91
\n~ \xe2\x95\x91 3 | constexpr const int *p = &i; \xe2\x95\x91
\n~ \xe2\x95\x91 | ^~ \xe2\x95\x91
\n~ \xe2\x95\x91 \xe2\x95\x91

\n
\n

这是我的 g++ 版本:

\n
    \xe2\x95\x91Target: x86_64-pc-linux-gnu                                             \xe2\x95\x91  \n    \xe2\x95\x91Configured with: /build/gcc/src/gcc/configure --enable-languages=c,c++,a\xe2\x95\x91\n~   \xe2\x95\x91da,fortran,go,lto,objc,obj-c++,d --enable-bootstrap --prefix=/usr --libd\xe2\x95\x91\n~   \xe2\x95\x91ir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr\xe2\x95\x91\n~   \xe2\x95\x91/share/info --with-bugurl=https://bugs.archlinux.org/ --with-build-confi\xe2\x95\x91\n~   \xe2\x95\x91g=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable\xe2\x95\x91\n~   \xe2\x95\x91-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-cloca\xe2\x95\x91\n~   \xe2\x95\x91le=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-f\xe2\x95\x91\n~   \xe2\x95\x91unction --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable\xe2\x95\x91  \n~   \xe2\x95\x91-link-serialization=1 --enable-linker-build-id --enable-lto --enable-mul\xe2\x95\x91  \n~   \xe2\x95\x91tilib --enable-plugin --enable-shared --enable-threads=posix --disable-l\xe2\x95\x91  \n~   \xe2\x95\x91ibssp --disable-libstdcxx-pch --disable-werror                          \xe2\x95\x91  \n~   \xe2\x95\x91Thread model: posix                                                     \xe2\x95\x91  \n~   \xe2\x95\x91Supported LTO compression algorithms: zlib zstd                         \xe2\x95\x91  \n~   \xe2\x95\x91gcc version 12.2.0 (GCC)  \n
Run Code Online (Sandbox Code Playgroud)\n

我只是按照 IDE 的建议在i之前添加了一个static关键字,它就可以工作,但我真的不明白为什么。

\n

use*_*522 6

constexpr不会改变变量的存储持续时间。您i仍然是一个具有自动存储持续时间的局部变量,该变量一直存在到定义它的块的末尾,并且每次调用函数都有一个新的变量实例i(尽管所有这些实例都具有相同的常量值)。

编译时常量值应p引用以下哪个实例?无法决定,因此指向自动存储持续时间变量的指针不允许是常量表达式的结果。

static给出变量静态存储持续时间。那么在整个程序持续时间内只有一个实例i,因此很清楚编译时常量值p将引用哪个对象。所以这是允许的。事实上,因为您的初始化程序p实际上并未读取的ii所以不需要这样做constexpr