Tha*_*yen 1 c++ pointers constexpr
int main() {\n constexpr int i = 5;\n constexpr const int *p = &i;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n编译上面的代码后:
\ng++ main.cpp\nRun Code Online (Sandbox Code Playgroud)\n这是错误:
\n\n\nmain.cpp: 在函数 \xe2\x80\x98int main()\xe2\x80\x99: \xe2\x95\x91
\n
\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
这是我的 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) \nRun Code Online (Sandbox Code Playgroud)\n我只是按照 IDE 的建议在i之前添加了一个static关键字,它就可以工作,但我真的不明白为什么。
\nconstexpr不会改变变量的存储持续时间。您i仍然是一个具有自动存储持续时间的局部变量,该变量一直存在到定义它的块的末尾,并且每次调用函数都有一个新的变量实例i(尽管所有这些实例都具有相同的常量值)。
编译时常量值应p引用以下哪个实例?无法决定,因此指向自动存储持续时间变量的指针不允许是常量表达式的结果。
static给出变量静态存储持续时间。那么在整个程序持续时间内只有一个实例i,因此很清楚编译时常量值p将引用哪个对象。所以这是允许的。事实上,因为您的初始化程序p实际上并未读取的值i,i所以不需要这样做constexpr。